使用 Firebase 快取

Looker Studio 報表有專屬的快取系統。建立連結器時,您可以實作自訂快取,加快報表產生速度,並避免達到 API 速率限制。

舉例來說,您要建立的連接器會提供特定郵遞區號過去 7 天的歷史天氣資料。您的連接器越來越受歡迎,但您從中擷取資料的外部 API 設有嚴格的速率限制。API 每天只會更新一次資料,因此針對特定郵遞區號,一天內不必多次擷取相同資料。使用這份解決方案指南,即可為每個郵遞區號實作每日快取。

需求條件

  • Firebase 即時資料庫。如果沒有,請建立 Google Cloud Platform (GCP) 專案,然後按照「開始使用」指南建立自己的 Firebase Realtime Database 執行個體。
  • 用來讀取及寫入 Firebase 即時資料庫資料的 GCP 服務帳戶。
  • 從來源擷取資料的社群連結器。

限制

  • 這項解決方案無法與 Looker Studio 進階服務搭配使用。使用 Looker Studio 進階服務時,Apps Script 中的連結器程式碼無法存取資料。因此您無法使用 Apps Script 快取資料。
  • 報表編輯者和檢視者無法重設這個特定快取。

解決方案

實作服務帳戶

  1. 在 Google Cloud 專案中建立服務帳戶
  2. 請確認這個服務帳戶在雲端專案中具有 BigQuery 存取權。
    • 必要的身分與存取權管理 (IAM) 角色:Firebase Admin
  3. 下載 JSON 檔案,取得服務帳戶金鑰。將檔案內容儲存在連接器專案的指令碼屬性中。新增金鑰後,Apps Script UI 應會顯示類似下列的內容:
    在指令碼屬性中儲存服務帳戶金鑰
  4. 在 Apps Script 專案中加入 OAuth2 for Apps Script 程式庫。
  5. 為服務帳戶實作必要的 OAuth2 程式碼:
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'
    ]);
}

導入程式碼,以便從 Firebase 讀取及寫入資料

您將使用 Firebase Database REST API,在 Firebase 即時資料庫中讀取及寫入資料。下列程式碼會實作存取這個 API 所需的方法。

實作 getData()

不含快取的現有 getData() 程式碼結構應如下所示:

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

如要在 getData() 程式碼中使用快取,請按照下列步驟操作:

  1. 判斷應快取的資料「區塊」或「單位」。
  2. 建立專屬鍵,在快取中儲存最小資料單位。
    以範例實作方式來說,configparams 中的 zipcode 會做為金鑰。
    選用:如要使用個別使用者的快取,請使用基本金鑰和使用者身分建立複合鍵。導入範例:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. 如果快取資料存在,請檢查快取是否為最新版本。
    在這個範例中,特定郵遞區號的快取資料會連同目前日期一併儲存。從快取擷取資料時,系統會比對快取日期與目前日期。

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. 如果沒有快取資料或快取資料不是最新版本,請從來源擷取資料並儲存在快取中。

在以下範例中,main.js 包含已實作快取的 getData() 程式碼。

範例程式碼

其他資源

Chrome UX Connector 可根據約 20 GB 的 BigQuery 表格,為數千名使用者提供資訊主頁。這個連接器會使用 Firebase 即時資料庫和 Apps Script 快取服務,採取雙層快取方法。如需導入詳情,請參閱程式碼