Pamięć podręczna Firebase

Looker Studio ma własny system pamięci podręcznej dla raportów. Podczas tworzenia konektora możesz wdrożyć niestandardową pamięć podręczną, aby przyspieszyć generowanie raportów i uniknąć limitów żądań interfejsu API.

Na przykład tworzysz łącznik, który udostępnia historyczne dane pogodowe z ostatnich 7 dni dla określonego kodu pocztowego. Twój łącznik staje się coraz bardziej popularny, ale zewnętrzny interfejs API, z którego pobierasz dane, ma ścisłe limity szybkości. Interfejs API aktualizuje dane tylko raz dziennie, więc w przypadku konkretnego kodu pocztowego nie ma potrzeby pobierania tych samych danych wielokrotnie w ciągu dnia. Korzystając z tego przewodnika, możesz wdrożyć codzienną pamięć podręczną dla każdego kodu pocztowego.

Wymagania

  • Baza danych czasu rzeczywistego Firebase. Jeśli nie masz dostępu do takiego projektu, utwórz projekt Google Cloud Platform (GCP) i postępuj zgodnie z przewodnikiem 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.
  • Oprogramowanie sprzęgające utworzone przez społeczność, które pobiera dane ze źródła.

Ograniczenia

  • Tego rozwiązania nie można używać z usługami zaawansowanymi Looker Studio. Gdy korzystasz z usług zaawansowanych Looker Studio, kod oprogramowania sprzęgającego w Apps Script nie ma dostępu do danych. Dlatego nie możesz zapisywać danych w pamięci podręcznej za pomocą Apps Script.
  • Osoby edytujące i wyświetlające raporty 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. Upewnij się, że to konto usługi ma dostęp do BigQuery w projekcie w chmurze.
    • Wymagane role Identity and Access Management (IAM): Firebase Admin
  3. Pobierz plik JSON, aby uzyskać klucze kont usługi. Przechowuj zawartość pliku we właściwościach skryptu projektu łącznika. Po dodaniu kluczy interfejs Apps Script powinien wyglądać podobnie do tego:
    Zapisywanie kluczy konta usługi we właściwościach skryptu
  4. Dołącz bibliotekę OAuth2 for Apps Script do projektu Apps Script.
  5. Wdróż 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'
    ]);
}

Wdróż kod do odczytywania i zapisywania danych w Firebase

Do odczytywania i zapisywania danych w bazie danych czasu rzeczywistego Firebase będziesz używać interfejsu Firebase Database REST API. Poniższy kod implementuje metody potrzebne do uzyskania dostępu do tego interfejsu API.

Implementacja funkcji getData()

Struktura dotychczasowego kodu getData() bez buforowania 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 używać pamięci podręcznej w kodzie getData(), wykonaj te czynności:

  1. Określ „fragment” lub „jednostkę” danych, które mają być buforowane.
  2. Utwórz unikalny klucz do przechowywania w pamięci podręcznej minimalnej jednostki danych.
    W przykładowej implementacji jako klucz używana jest wartość zipcodeconfigparams.
    Opcjonalnie: w przypadku pamięci podręcznej dla poszczególnych użytkowników utwórz klucz złożony z klucza podstawowego 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 dane w pamięci podręcznej istnieją, sprawdź, czy są aktualne.
    W tym przykładzie dane w pamięci podręcznej dla określonego kodu pocztowego są zapisywane z bieżącą datą. Gdy dane są pobierane z pamięci podręcznej, data pamięci podręcznej jest sprawdzana pod kątem zgodności 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 są nieaktualne, pobierz dane ze źródła i zapisz je w pamięci podręcznej.

W tym przykładzie main.js zawiera kod getData() z zastosowanym buforowaniem.

Przykładowy kod

Dodatkowe materiały

Chrome UX Connector udostępnia tysiącom użytkowników panel oparty na tabeli BigQuery o rozmiarze około 20 GB. To oprogramowanie sprzęgające korzysta z Bazy danych czasu rzeczywistego Firebase i usługi pamięci podręcznej Apps Script, co zapewnia dwuwarstwowe podejście do buforowania. Szczegółowe informacje o implementacji znajdziesz w sekcji kod.