Meng-cache dengan Firebase

Looker Studio memiliki sistem cache sendiri untuk laporan. Saat membuat konektor, Anda dapat menerapkan cache kustom untuk memfasilitasi laporan yang lebih cepat dan menghindari batas frekuensi APR.

Misalnya, Anda membuat konektor yang menyediakan data cuaca historis selama 7 hari terakhir untuk kode pos tertentu. Konektor Anda menjadi cukup populer, tetapi API eksternal tempat Anda mengambil data memiliki batas frekuensi yang ketat. API hanya memperbarui datanya setiap hari, jadi untuk kode pos tertentu, tidak perlu mengambil data yang sama beberapa kali dalam sehari. Dengan panduan solusi ini, Anda dapat menerapkan cache harian untuk setiap kode pos.

Persyaratan

  • Database Firebase Realtime. Jika Anda tidak memiliki akses ke salah satunya, buat project Google Cloud Platform (GCP) dan ikuti panduan Mulai untuk membuat instance Firebase Realtime Database Anda sendiri.
  • Akun layanan GCP untuk membaca dan menulis data dari Firebase Realtime Database.
  • Konektor Komunitas yang mengambil data dari sumber.

Batasan

  • Solusi ini tidak dapat digunakan dengan Layanan Lanjutan Looker Studio. Saat Anda menggunakan Layanan Lanjutan Looker Studio, kode konektor Anda di Apps Script tidak memiliki akses ke data. Oleh karena itu, Anda tidak dapat menyimpan data dalam cache menggunakan Apps Script.
  • Editor dan pelihat laporan tidak dapat mereset cache tertentu ini.

Solusi

Menerapkan akun layanan

  1. Buat akun layanan di project Google Cloud Anda.
  2. Pastikan akun layanan ini memiliki akses BigQuery di project cloud.
    • Peran Identity and Access Management (IAM) yang Diperlukan: Firebase Admin
  3. Download file JSON untuk mendapatkan kunci akun layanan. Simpan konten file di properti skrip project konektor Anda. Setelah menambahkan kunci, akan terlihat seperti ini di UI Apps Script:
    Menyimpan kunci akun layanan di Properti Skrip
  4. Sertakan library OAuth2 untuk Apps Script di project Apps Script Anda.
  5. Terapkan kode OAuth2 yang diperlukan untuk akun layanan:
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'
    ]);
}

Terapkan kode untuk membaca dan menulis dari Firebase

Anda akan menggunakan Firebase Database REST API untuk membaca dan menulis ke Firebase Realtime Database. Kode berikut mengimplementasikan metode yang diperlukan untuk mengakses API ini.

Mengimplementasikan getData()

Struktur untuk kode getData() yang ada tanpa caching akan terlihat seperti ini:

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

Untuk menggunakan caching dalam kode getData(), ikuti langkah-langkah berikut:

  1. Tentukan 'potongan' atau 'unit' data yang harus di-cache.
  2. Buat kunci unik untuk menyimpan unit data minimum dalam cache.
    Untuk contoh penerapan, zipcode dari configparams digunakan sebagai kunci.
    Opsional: Untuk cache per pengguna, buat kunci komposit dengan kunci dasar dan identitas pengguna. Contoh penerapan:
    js var baseKey = getBaseKey(request); var userEmail = Session.getEffectiveUser().getEmail(); var hasheduserEmail = getHashedValue(userEmail); var compositeKey = baseKey + hasheduserEmail;

  3. Jika data yang di-cache ada, periksa apakah cache masih baru.
    Dalam contoh, data yang di-cache untuk kode pos tertentu disimpan dengan tanggal saat ini. Saat data diambil dari cache, tanggal untuk cache diperiksa berdasarkan tanggal saat ini.

    var cacheForZipcode = {
      data: <data being cached>,
      ymd: <current date in YYYYMMDD format>
    }
    
  4. Jika data yang di-cache tidak ada atau data yang di-cache tidak baru, ambil data dari sumber dan simpan di cache.

Dalam contoh berikut, main.js menyertakan kode getData() dengan penerapan penyimpanan dalam cache.

Kode contoh

Referensi lainnya

Chrome UX Connector memfasilitasi dasbor berdasarkan tabel BigQuery ~20 GB untuk ribuan pengguna. Konektor ini menggunakan Firebase Realtime Database bersama dengan Apps Script Cache Service untuk pendekatan penyiapan cache dua lapis. Lihat kode untuk mengetahui detail penerapan.