Mettre en cache avec Firebase

Looker Studio dispose de son propre système de mise en cache pour les rapports. Lorsque vous créez votre vous pouvez implémenter un cache personnalisé pour générer plus rapidement des rapports évitez les taux TAEG.

Par exemple, vous créez un connecteur qui fournit des données météorologiques historiques. au cours des sept derniers jours pour un code postal spécifique. Votre connecteur va bientôt commencer populaire, mais l'API externe à partir de laquelle vous récupérez les données a un taux strict des limites. L'API ne met à jour ses données que quotidiennement. Par conséquent, pour un code postal spécifique, n'a pas besoin d'extraire les mêmes données plusieurs fois au cours d'une même journée. Utilisation vous pouvez mettre en œuvre un cache quotidien pour chaque code postal.

Conditions requises

  • Une base de données Firebase Realtime Si vous n'en avez pas, créez un projet Google Cloud Platform (GCP) et suivez le Guide de démarrage pour créer votre propre Firebase Instance Realtime Database.
  • Un compte de service GCP pour lire et écrire des données à partir de Firebase Realtime base de données.
  • Un connecteur de communauté qui récupère des données à partir d'une source.

Limites

  • Cette solution ne peut pas être utilisée avec les services avancés Looker Studio. Quand ? vous utilisez les services avancés de Looker Studio, votre code de connecteur dans les applications. Le script n'a pas accès aux données. Vous ne pouvez donc pas mettre en cache les données à l'aide d'Apps Script.
  • Les lecteurs et les éditeurs du rapport ne peuvent pas réinitialiser ce cache spécifique.

Solution

Implémenter un compte de service

  1. Créez un compte de service dans votre projet Google Cloud.
  2. Assurez-vous que ce compte de service dispose d'un accès BigQuery dans le projet Cloud.
    • Rôles IAM (Identity and Access Management) requis: Firebase Admin
  3. Téléchargez le fichier JSON pour obtenir les clés de comptes de service. Stockez le fichier dans les propriétés de script de votre projet de connecteur. Après avoir ajouté doivent ressembler à ceci dans l'interface utilisateur d'Apps Script:
    Enregistrer des clés de compte de service dans les propriétés de script
  4. Incluez la bibliothèque OAuth2 for Apps Script dans votre projet Apps Script.
  5. Implémentez le code OAuth2 requis pour le compte de service:
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'
    ]);
}

Implémenter du code pour lire et écrire des données depuis Firebase

Vous utiliserez l'API REST Firebase Database pour lire et écrire des données dans un projet Firebase Realtime Database. Le code suivant implémente les méthodes nécessaires pour qui accèdent à cette API.

Implémenter getData()

La structure de votre code getData() existant sans mise en cache doit se présenter comme suit : comme ceci:

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

Pour utiliser la mise en cache dans votre code getData(), procédez comme suit:

  1. Déterminer le fragment ou 'unité' de données à mettre en cache.
  2. Créez une clé unique pour stocker l'unité minimale de données dans le cache.
    Pour l'exemple d'implémentation, zipcode de configparams est utilisé. comme clé.
    Facultatif: Pour le cache par utilisateur, créez une clé composite avec la clé de base et identité de l'utilisateur. Exemple d'implémentation:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Si des données mises en cache existent, vérifiez si le cache est à jour.
    Dans cet exemple, les données mises en cache d'un code postal spécifique sont enregistrées à l'aide de l'attribut la date actuelle. Lorsque les données sont extraites du cache, la date du cache est par rapport à la date du jour.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Si les données mises en cache n'existent pas ou si les données mises en cache ne sont pas récentes, récupérez les données depuis la source et les stocker dans le cache.

Dans l'exemple suivant, main.js inclut du code getData() avec mise en cache. mise en œuvre.

Exemple de code

Ressources supplémentaires

Le connecteur d'expérience utilisateur Chrome permet d'obtenir un tableau de bord basé sur un volume BigQuery d'environ 20 Go à des milliers d'utilisateurs. Ce connecteur utilise Firebase Realtime Database en plus du service de cache Apps Script pour une mise en cache à deux couches. Voir code pour obtenir plus d'informations sur l'implémentation.