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 pembatasan kapasitas APR.

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

Persyaratan

  • Database Firebase Realtime. Jika Anda tidak memiliki akses ke instance tersebut, buat project Google Cloud Platform (GCP) dan ikuti panduan Memulai 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. Dengan demikian, Anda tidak dapat menyimpan data dalam cache menggunakan Apps Script.
  • Editor dan pelihat laporan tidak dapat mereset cache spesifik ini.

Solusi

Mengimplementasikan 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'
    ]);
}

Mengimplementasikan kode untuk membaca dan menulis dari Firebase

Anda akan menggunakan Firebase Database REST API untuk membaca dan menulis ke database Firebase Realtime. Kode berikut menerapkan 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 penyimpanan cache dalam kode getData(), ikuti langkah-langkah berikut:

  1. Tentukan 'bagian' atau 'unit' data yang harus di-cache.
  2. Buat kunci unik untuk menyimpan unit data minimum dalam cache.
    Untuk contoh implementasi, zipcode dari configparams digunakan sebagai kunci.
    Opsional: Untuk cache per pengguna, buat kunci gabungan dengan kunci dasar dan identitas pengguna. Contoh implementasi:
    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.
    Pada 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.

Pada contoh berikut, main.js menyertakan kode getData() dengan mengimplementasikan cache.

Kode contoh

Referensi lainnya

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