Memorizza nella cache con Firebase

Looker Studio ha un proprio sistema di cache per i report. Quando crei il connettore, puoi implementare una cache personalizzata per facilitare la creazione di report più veloci ed evitare i limiti di frequenza delle API.

Ad esempio, stai creando un connettore che fornisce dati meteo storici degli ultimi 7 giorni per un codice postale specifico. Il tuo connettore sta diventando piuttosto popolare, ma l'API esterna da cui recuperi i dati ha limiti di frequenza rigidi. L'API aggiorna i dati solo una volta al giorno, quindi per un codice postale specifico non è necessario recuperare gli stessi dati più volte al giorno. Utilizzando questa guida alla soluzione, puoi implementare una cache giornaliera per ogni codice postale.

Requisiti

  • Un database Firebase Realtime. Se non ne hai accesso, crea un progetto Google Cloud (GCP) e segui la guida Inizia per creare la tua istanza di Firebase Realtime Database.
  • Un service account 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 in Apps Script non ha accesso ai dati. Pertanto, non puoi memorizzare nella cache i dati utilizzando Apps Script.
  • Gli editor e i visualizzatori dei report non possono reimpostare questa cache specifica.

Soluzione

Implementare un service account

  1. Crea un service account nel tuo progetto Google Cloud.
  2. Assicurati che questo service account abbia accesso a BigQuery nel progetto cloud.
    • Ruoli IAM (Identity and Access Management) richiesti: Firebase Admin
  3. Scarica il file JSON per ottenere le chiavi degli account di servizio. Memorizza i contenuti del file nelle proprietà dello script del progetto del connettore. Dopo aver aggiunto le chiavi, l'interfaccia utente di Apps Script dovrebbe avere un aspetto simile a questo:
    Salvataggio delle chiavi del service account in Proprietà 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 il codice per leggere e scrivere da Firebase

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

Implementa getData()

La struttura del codice getData() esistente senza memorizzazione nella cache dovrebbe essere simile a questa:

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 codice getData():

  1. Determina il "blocco" o l'"unità" di dati da memorizzare nella cache.
  2. Crea una chiave univoca per archiviare l'unità minima di dati nella cache.
    Per l'implementazione di esempio, viene utilizzato zipcode da configparams come chiave.
    (Facoltativo): per la cache per utente, crea una chiave composita con la chiave di base e l'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, verifica che la cache sia aggiornata.
    Nell'esempio, i dati memorizzati nella cache per un codice postale specifico vengono salvati con la data corrente. Quando i dati vengono recuperati dalla cache, la data della cache viene confrontata 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 memorizzali nella cache.

Nel seguente esempio, main.js include il codice getData() con la memorizzazione nella cache implementata.

Esempio di codice

Risorse aggiuntive

Chrome UX Connector facilita una dashboard basata su una tabella BigQuery di circa 20 GB per migliaia di utenti. Questo connettore utilizza Firebase Realtime Database insieme al servizio di cache di Apps Script per un approccio di memorizzazione nella cache a due livelli. Per informazioni dettagliate sull'implementazione, consulta il codice.