使用 Firebase 快取

Looker Studio 有報表專屬的快取系統。製作專屬廣告活動時 連接器可以導入自訂快取,以加快報表製作速度, 避免年利率限制

例如,假設您正在建立提供歷史天氣資料的連接器 特定郵遞區號最近 7 天的資料你的連接器品質良好 但您擷取資料的外部 API 採用嚴格的頻率 API 只會每天更新資料,因此如特定郵遞區號, 不必在一天內多次擷取相同的資料使用此應用程式 解決方案指南,為每個郵遞區號實作每日快取。

需求條件

  • Firebase 即時資料庫。如果沒有存取權,請建立 Google Cloud Platform (GCP) 專案,並追蹤 入門指南:自行建立 Firebase 即時資料庫執行個體。
  • 可讀取及寫入 Firebase Realtime 資料的 GCP 服務帳戶 資料庫。
  • 可從來源擷取資料的社群連接器。

限制

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

解決方案

實作服務帳戶

  1. 在 Google Cloud 專案中建立服務帳戶
  2. 請確認這個服務帳戶具備雲端專案中的 BigQuery 存取權。
    • 必要的 Identity and Access Management (IAM) 角色:Firebase Admin
  3. 下載 JSON 檔案即可取得服務帳戶金鑰。儲存檔案的 資源指令碼屬性中所列的內容。將 金鑰,應在 Apps Script UI 中類似:
    在指令碼屬性中儲存服務帳戶金鑰
  4. 在您的 Apps Script 專案中加入 Apps Script 的 OAuth2 程式庫。
  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. 判斷「區塊」或「unit」代表應快取的資料
  2. 建立一個不重複的鍵,用於在快取中儲存最低資料單位。
    實作範例時,使用的是來自 configparamszipcode 做為鍵
    選用:針對每位使用者的快取,請建立含有基準金鑰和 使用者身分。導入範例:
    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 使用者體驗連接器提供約 20 GB BigQuery 的資訊主頁 提供給數千名使用者使用這個連接器使用 Firebase 即時資料庫 以及 Apps Script Cache Service,兩者都適用雙層快取方法。詳情請見 code