Memorizza nella cache con Firebase

Looker Studio dispone di un proprio sistema di cache per i report. Quando crei puoi implementare una cache personalizzata per velocizzare i report e evitare i limiti di tasso di TAEG.

Ad esempio, stai creando un connettore che fornisce dati meteo storici negli ultimi 7 giorni per un codice postale specifico. Il connettore sta diventando piuttosto molto popolare, ma l'API esterna da cui stai recuperando i dati ha una frequenza rigorosa limiti. L'API aggiorna i dati solo quotidianamente, quindi per un codice postale specifico, non è necessario recuperare gli stessi dati più volte in un giorno. Utilizzo di questo puoi implementare una cache giornaliera per ogni codice postale.

Requisiti

  • Un database Firebase Realtime. Se non ne hai accesso, crea un progetto Google Cloud e segui le Guida introduttiva per creare il tuo Firebase Realtime Database.
  • Un account di servizio Google Cloud per leggere e scrivere dati da Firebase Realtime Database.
  • Un connettore della community che recupera i dati da un'origine.

Limitazioni

  • Questa soluzione non può essere utilizzata con i servizi avanzati di Looker Studio. Quando utilizzi i servizi avanzati di Looker Studio, il codice del connettore nelle app Lo script non ha accesso ai dati. Non puoi quindi memorizzare i dati nella cache usando Apps Script.
  • Gli editor e i visualizzatori dei report non possono reimpostare questa cache specifica.

Soluzione

Implementare un account di servizio

  1. Crea un account di servizio nel tuo progetto Google Cloud.
  2. Assicurati che questo account di servizio disponga dell'accesso a BigQuery nel progetto cloud.
    • Ruoli IAM (Identity and Access Management) richiesti: Firebase Admin
  3. Scarica il file JSON per recuperare le chiavi degli account di servizio. Archivia il percorso contenuti nelle proprietà dello script del progetto connettore. Dopo aver aggiunto il parametro , dovrebbero avere un aspetto simile a questo nell'interfaccia utente di Apps Script:
    Salvataggio delle chiavi degli account di servizio nelle proprietà dello script
  4. Includi la libreria OAuth2 per Apps Script nel tuo progetto Apps Script.
  5. Implementa il codice OAuth2 richiesto per l'account di servizio:
firestore-cache/src/firebase.js
var SERVICE_ACCOUNT_CREDS = 'SERVICE_ACCOUNT_CREDS';
var SERVICE_ACCOUNT_KEY = 'private_key';
var SERVICE_ACCOUNT_EMAIL = 'client_email';
var BILLING_PROJECT_ID = 'project_id';

var scriptProperties = PropertiesService.getScriptProperties();

/**
 * Copy the entire credentials JSON file from creating a service account in GCP.
 * Service account should have `Firebase Admin` IAM role.
 */
function getServiceAccountCreds() {
  return JSON.parse(scriptProperties.getProperty(SERVICE_ACCOUNT_CREDS));
}

function getOauthService() {
  var serviceAccountCreds = getServiceAccountCreds();
  var serviceAccountKey = serviceAccountCreds[SERVICE_ACCOUNT_KEY];
  var serviceAccountEmail = serviceAccountCreds[SERVICE_ACCOUNT_EMAIL];

  return OAuth2.createService('FirebaseCache')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(serviceAccountKey)
    .setIssuer(serviceAccountEmail)
    .setPropertyStore(scriptProperties)
    .setCache(CacheService.getScriptCache())
    .setScope([
      'https://www.googleapis.com/auth/userinfo.email',
      'https://www.googleapis.com/auth/firebase.database'
    ]);
}

Implementa codice per la lettura e la scrittura da Firebase

Utilizzerai l'API REST Database di Firebase per leggere e scrivere su un database Firebase Realtime Database. Il seguente codice implementa i metodi necessari per che accede a questa API.

Implementare getData()

La struttura del codice getData() esistente senza memorizzazione nella cache dovrebbe avere il seguente aspetto nel seguente modo:

firestore-cache/src/without-caching.js
/*
 * This file is only to demonstrate how the `getData()` fucntion would look
 * like without the Firebase Realtime Database caching. It is not a part of
 * the connector code and should not be included in Apps Script / Clasp.
 */

function getData(request) {
  var requestedFields = getFields().forIds(
    request.fields.map(function(field) {
      return field.name;
    })
  );

  var fetchedData = fetchAndParseData(request);
  var data = getFormattedData(fetchedData, requestedFields);

  return {
    schema: requestedFields.build(),
    rows: data
  };
}

Per utilizzare la memorizzazione nella cache nel tuo codice getData(), segui questi passaggi:

  1. Determina il "chunk" o "unità" di dati che devono essere memorizzati nella cache.
  2. Crea una chiave univoca per archiviare l'unità minima di dati nella cache.
    Per l'implementazione di esempio, viene utilizzato zipcode di configparams come chiave.
    Facoltativo: per la cache per utente, crea una chiave composita con la chiave di base e identità utente. Esempio di implementazione:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Se esistono dati memorizzati nella cache, controlla se la cache è aggiornata.
    Nell'esempio, i dati memorizzati nella cache per un codice postale specifico vengono salvati con data corrente. Quando i dati vengono recuperati dalla cache, la data della cache è confrontato con la data corrente.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Se i dati memorizzati nella cache non esistono o non sono aggiornati, recupera i dati dall'origine e memorizzarlo nella cache.

Nell'esempio seguente, main.js include codice getData() con memorizzazione nella cache implementate.

Esempio di codice

Risorse aggiuntive

Il connettore UX di Chrome facilita una dashboard basata su un ambiente BigQuery da circa 20 GB per migliaia di utenti. Questo connettore utilizza Firebase Realtime Database insieme al servizio di cache di Apps Script per un approccio alla memorizzazione nella cache a due livelli. Consulta code per i dettagli dell'implementazione.