Mit Firebase im Cache speichern

Looker Studio hat ein eigenes Cachesystem für Berichte. Beim Erstellen des Connectors können Sie einen benutzerdefinierten Cache implementieren, um Berichte zu beschleunigen und APR-Ratenbeschränkungen zu vermeiden.

Sie erstellen beispielsweise einen Connector, der historische Wetterdaten für die letzten 7 Tage für eine bestimmte Postleitzahl bereitstellt. Ihr Connector wird immer beliebter, aber die externe API, von der Sie die Daten abrufen, hat strenge Ratenbeschränkungen. Die API aktualisiert ihre Daten nur täglich. Für eine bestimmte Postleitzahl müssen Sie die gleichen Daten also nicht mehrmals am Tag abrufen. Mit dieser Lösung können Sie einen täglichen Cache für jede Postleitzahl implementieren.

Voraussetzungen

  • Eine Firebase Realtime Database. Wenn Sie keinen Zugriff auf eine solche Instanz haben, erstellen Sie ein Google Cloud-Projekt und folgen Sie der Anleitung unter Erste Schritte, um eine eigene Firebase Realtime Database-Instanz zu erstellen.
  • Ein GCP-Dienstkonto zum Lesen und Schreiben von Daten aus der Firebase Realtime Database.
  • Ein Community-Connector, mit dem Daten aus einer Quelle abgerufen werden.

Beschränkungen

  • Diese Lösung kann nicht mit Looker Studio Advanced Services verwendet werden. Wenn Sie Looker Studio Advanced Services verwenden, hat Ihr Connector-Code in Apps Script keinen Zugriff auf die Daten. Daher können Sie die Daten nicht mit Apps Script im Cache speichern.
  • Betrachter und Bearbeiter des Berichts können diesen Cache nicht zurücksetzen.

Lösung

Dienstkonto implementieren

  1. Erstellen Sie ein Dienstkonto in Ihrem Google Cloud-Projekt.
  2. Dieses Dienstkonto muss Zugriff auf BigQuery im Cloud-Projekt haben.
    • Erforderliche IAM-Rollen (Identity and Access Management): Firebase Admin
  3. Laden Sie die JSON-Datei herunter, um die Dienstkontoschlüssel zu erhalten. Speichern Sie den Inhalt der Datei in den Skripteigenschaften Ihres Connector-Projekts. Nachdem Sie die Schlüssel hinzugefügt haben, sollte es in der Apps Script-Benutzeroberfläche in etwa so aussehen:
    Dienstkontoschlüssel in Skripteigenschaften speichern
  4. Fügen Sie die OAuth2 for Apps Script-Bibliothek in Ihr Apps Script-Projekt ein.
  5. Implementieren Sie den erforderlichen OAuth2-Code für das Dienstkonto:
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'
    ]);
}

Code zum Lesen und Schreiben in Firebase implementieren

Sie verwenden die Firebase Database REST API, um Daten in eine Firebase Realtime Database zu lesen und zu schreiben. Der folgende Code implementiert die Methoden, die für den Zugriff auf diese API erforderlich sind.

getData() implementieren

Die Struktur für Ihren vorhandenen getData()-Code ohne Caching sollte so aussehen:

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
  };
}

So verwenden Sie Caching in Ihrem getData()-Code:

  1. Legen Sie fest, welcher „Chunk“ oder welche „Einheit“ von Daten im Cache gespeichert werden soll.
  2. Erstellen Sie einen eindeutigen Schlüssel zum Speichern der kleinsten Dateneinheit im Cache.
    Für die Beispielimplementierung wird zipcode aus configparams als Schlüssel verwendet.
    Optional: Erstellen Sie für den Cache pro Nutzer einen zusammengesetzten Schlüssel mit dem Basisschlüssel und der Nutzeridentität. Beispielimplementierung:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Wenn Daten im Cache vorhanden sind, prüfen Sie, ob der Cache aktuell ist.
    Im Beispiel werden die im Cache gespeicherten Daten für eine bestimmte Postleitzahl mit dem aktuellen Datum gespeichert. Wenn Daten aus dem Cache abgerufen werden, wird das Datum des Cache mit dem aktuellen Datum verglichen.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Wenn keine im Cache gespeicherten Daten vorhanden sind oder die im Cache gespeicherten Daten nicht aktuell sind, rufen Sie Daten aus der Quelle ab und speichern Sie sie im Cache.

Im folgenden Beispiel enthält main.js getData()-Code mit implementiertem Caching.

Beispielcode

Zusätzliche Ressourcen

Mit dem Chrome UX Connector kann ein Dashboard, das auf einer etwa 20 GB großen BigQuery-Tabelle basiert, für Tausende von Nutzern bereitgestellt werden. Für diesen Connector wird die Firebase Realtime Database zusammen mit dem Apps Script Cache Service für einen zweistufigen Caching-Ansatz verwendet. Einzelheiten zur Implementierung finden Sie im Code.