Mit Firebase im Cache speichern

In Looker Studio gibt es ein eigenes Cache-System für Berichte. Beim Erstellen Ihrer Connector implementieren, können Sie einen benutzerdefinierten Cache implementieren, um schnellere Berichte und zu vermeiden.

Beispiel: Sie erstellen einen Connector, der historische Wetterdaten bereitstellt. der letzten sieben Tage für eine bestimmte Postleitzahl. Ihr Connector ist mittlerweile ziemlich beliebt, aber die externe API, von der Sie die Daten abrufen, hat eine strenge Rate Beschränkungen. Da die API ihre Daten nur täglich aktualisiert, gibt es für eine bestimmte Postleitzahl dieselben Daten nicht mehrmals am Tag abgerufen werden müssen. Mit diesem Lösungsleitfaden für jede Postleitzahl einen täglichen Cache implementieren.

Voraussetzungen

  • Eine Firebase Realtime-Datenbank. Wenn Sie keinen Zugriff darauf haben, erstellen Sie ein Google Cloud Platform-Projekt (GCP) und folgen Sie der Startleitfaden zum Erstellen eines eigenen Firebase Realtime Database-Instanz.
  • Ein GCP-Dienstkonto zum Lesen und Schreiben von Daten aus Firebase Realtime Datenbank.
  • Community-Connector, der Daten aus einer Quelle abruft.

Beschränkungen

  • Diese Lösung kann nicht mit erweiterten Looker Studio-Diensten verwendet werden. Wann? Sie die erweiterten Looker Studio-Dienste, Ihren Connector-Code in Apps, verwenden Das Skript hat keinen Zugriff auf die Daten. Daher können Sie die Daten nicht mit Apps Script.
  • Mitbearbeiter und Betrachter des Berichts können diesen Cache nicht zurücksetzen.

Lösung

Dienstkonto implementieren

  1. Erstellen Sie ein Dienstkonto in Ihrem Google Cloud-Projekt.
  2. Stellen Sie sicher, dass dieses Dienstkonto im Cloud-Projekt BigQuery-Zugriff hat.
    • Erforderliche IAM-Rollen (Identity and Access Management): Firebase Admin
  3. Laden Sie die JSON-Datei herunter, um die Dienstkontoschlüssel abzurufen. Speichern Sie die in den Skripteigenschaften Ihres Verbindungsprojekts. Nach dem Hinzufügen der Schlüssels, sollte in der Apps Script-Benutzeroberfläche so aussehen:
    Dienstkontoschlüssel in Skripteigenschaften speichern
  4. Binden Sie die Bibliothek OAuth2 for Apps Script 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 aus Firebase implementieren

Sie verwenden die REST API von Firebase Database, um in einem Firebase-Projekt Echtzeitdatenbank. Mit dem folgenden Code werden die Methoden implementiert, die für auf diese API zugreifen.

getData() implementieren

Die Struktur Ihres vorhandenen getData()-Codes ohne Caching sollte so aussehen: wie hier:

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. Den „Block“ bestimmen oder 'Einheit' [unit] die im Cache gespeichert werden sollten.
  2. Erstellen Sie einen eindeutigen Schlüssel, um die Mindestdateneinheit im Cache zu speichern.
    Für die Beispielimplementierung wird zipcode von configparams verwendet als Schlüssel ein.
    Optional: Erstellen Sie für den nutzerspezifischen Cache einen zusammengesetzten Schlüssel mit dem Basisschlüssel und 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.
    In diesem Beispiel werden die im Cache gespeicherten Daten für eine bestimmte Postleitzahl mit dem Datum. Wenn Daten aus dem Cache abgerufen werden, ist das Datum für den Cache mit dem aktuellen Datum verglichen.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Daten abrufen, wenn im Cache gespeicherte Daten nicht vorhanden oder nicht aktuell sind aus der Quelle und speichern sie im Cache.

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

Beispielcode

Zusätzliche Ressourcen

Mit dem Chrome UX Connector lässt sich ein Dashboard auf der Grundlage von BigQuery mit etwa 20 GB erstellen. für Tausende von Nutzenden bereitstellen. Dieser Connector verwendet die Firebase Realtime Database zusammen mit dem Apps Script Cache Service für einen zweischichtigen Caching-Ansatz. Weitere Informationen finden Sie unter Code.