Pamięć podręczna Firebase

Looker Studio ma własny system pamięci podręcznej raportów. Tworząc oprogramowanie sprzęgające, możesz wdrożyć niestandardową pamięć podręczną, aby przyspieszyć generowanie raportów i uniknąć limitów RRSO.

Tworzysz na przykład oprogramowanie sprzęgające, które udostępnia historyczne dane o pogodzie z ostatnich 7 dni dla określonego kodu pocztowego. Twoje oprogramowanie sprzęgające staje się dość popularne, ale zewnętrzny interfejs API, z którego pobierasz dane, ma rygorystyczne ograniczenia szybkości. Dane interfejsu API są aktualizowane tylko codziennie, więc w przypadku konkretnego kodu pocztowego nie trzeba pobierać tych samych danych wiele razy w ciągu jednego dnia. Korzystając z tego przewodnika, możesz wdrożyć codzienną pamięć podręczną dla każdego kodu pocztowego.

Wymagania

  • Bazę danych czasu rzeczywistego Firebase. Jeśli nie masz do niego dostępu, utwórz projekt Google Cloud Platform (GCP) i wykonaj czynności opisane w przewodniku Pierwsze kroki, aby utworzyć własną instancję Bazy danych czasu rzeczywistego Firebase.
  • Konto usługi GCP do odczytywania i zapisywania danych z Bazy danych czasu rzeczywistego Firebase.
  • Społeczność oprogramowanie sprzęgające, które pobiera dane ze źródła.

Ograniczenia

  • Tego rozwiązania nie można używać z zaawansowanymi usługami Looker Studio. Gdy używasz usług zaawansowanych Looker Studio, kod oprogramowania sprzęgającego w Apps Script nie ma dostępu do danych. Nie można więc buforować danych przy użyciu Apps Script.
  • Edytujący raporty i osoby przeglądające nie mogą zresetować tej konkretnej pamięci podręcznej.

Rozwiązanie

Wdrażanie konta usługi

  1. Utwórz konto usługi w projekcie Google Cloud.
  2. Sprawdź, czy to konto usługi ma dostęp do BigQuery w projekcie w chmurze.
    • Wymagane role zarządzania tożsamościami i dostępem: Firebase Admin
  3. Pobierz plik JSON, aby uzyskać klucze kont usługi. Przechowuj zawartość pliku we właściwościach skryptu projektu oprogramowania sprzęgającego. Po dodaniu kluczy w interfejsie Apps Script strona powinna wyglądać podobnie do tej:
    Zapisuję klucze konta usługi we właściwościach skryptu
  4. Dodaj bibliotekę OAuth2 dla Apps Script do projektu Apps Script.
  5. Zaimplementuj wymagany kod OAuth2 na koncie usługi:
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'
    ]);
}

Implementowanie kodu do odczytu i zapisu z Firebase

Do odczytu i zapisu w bazie danych Firebase Realtime możesz używać interfejsu API typu REST Firebase. Poniższy kod implementuje metody potrzebne do uzyskania dostępu do tego interfejsu API.

Implementacja getData()

Struktura istniejącego kodu getData() bez zapisywania w pamięci podręcznej powinna wyglądać tak:

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

Aby w kodzie getData() korzystać z pamięci podręcznej, wykonaj te czynności:

  1. Określ fragment lub jednostkę danych, które mają być zapisane w pamięci podręcznej.
  2. Utwórz unikalny klucz do przechowywania minimalnej jednostki danych w pamięci podręcznej.
    W przykładowej implementacji kluczem jest zipcode z configparams.
    Opcjonalnie: w przypadku pamięci podręcznej dla poszczególnych użytkowników utwórz klucz złożony z kluczem podstawowym i tożsamością użytkownika. Przykładowa implementacja:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Jeśli w pamięci podręcznej znajdują się dane, sprawdź, czy jest ona aktualna.
    W tym przykładzie dane w pamięci podręcznej dotyczące konkretnego kodu pocztowego są zapisywane z aktualną datą. Gdy dane są pobierane z pamięci podręcznej, data jej przechowywania jest porównywana z bieżącą datą.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Jeśli dane w pamięci podręcznej nie istnieją lub dane przechowywane w pamięci podręcznej są nieaktualne, pobierz dane ze źródła i zapisz je w pamięci podręcznej.

W poniższym przykładzie main.js zawiera kod getData() z zaimplementowanym buforowaniem.

Przykładowy kod

Dodatkowe zasoby

Oprogramowanie sprzęgające Chrome UX umożliwia tysiącom użytkowników dostęp do panelu opartego na 20 GB tabeli BigQuery. To oprogramowanie sprzęgające korzysta z Bazy danych czasu rzeczywistego Firebase i usługi Apps Script Cache, by zapewnić dwuwarstwowe buforowanie. Szczegóły implementacji znajdziesz w kodzie.