التخزين المؤقت باستخدام Firebase

تحتوي أداة Looker Studio على نظام ذاكرة تخزين مؤقت خاص بها للتقارير. عند إنشاء موصل، يمكنك تنفيذ ذاكرة تخزين مؤقت مخصصة لتسهيل إعداد التقارير تجنُّب حدود معدل الفائدة المئوية السنوية

على سبيل المثال، في حال إنشاء موصِّل يوفّر بيانات الطقس السابقة خلال آخر 7 أيام لرمز بريدي معيّن. يبدو أن الموصل شائعة ولكن تخضع واجهة برمجة التطبيقات الخارجية التي تجلب البيانات منها بمعدل صارم الحدود. تقوم واجهة برمجة التطبيقات بتحديث بياناتها يوميًا فقط، لذا بالنسبة للرمز البريدي المحدد، ليست هناك حاجة لجلب البيانات نفسها عدة مرات خلال يوم واحد. استخدام هذا دليل الحلول، يمكنك تنفيذ ذاكرة تخزين مؤقت يومية لكل رمز بريدي.

المتطلبات

  • قاعدة بيانات Firebase في الوقت الفعلي إذا لم يكن لديك إذن الوصول إليه، أنشئ Google Cloud Platform (GCP) وتتبع دليل البدء لإنشاء موقعك الإلكتروني على Firebase مثيل قاعدة البيانات في الوقت الفعلي.
  • حساب خدمة Google Cloud Platform لقراءة البيانات وكتابتها من Firebase في الوقت الفعلي قاعدة البيانات.
  • يشير ذلك المصطلح إلى موصِّل مجتمع يجلب البيانات من مصدر.

القيود

  • لا يمكن استخدام هذا الحلّ مع الخدمات المتقدّمة في Looker Studio. فعندما استخدام خدمات Looker Studio المتقدمة، رمز الموصِّل في التطبيقات لا يمكن للنص البرمجي الوصول إلى البيانات. وبالتالي لا يمكنك تخزين البيانات باستخدام "برمجة تطبيقات Google".
  • ولا يمكن لمحرِّري التقارير والمشاهدين إعادة ضبط ذاكرة التخزين المؤقت هذه.

الحل

تنفيذ حساب خدمة

  1. أنشِئ حساب خدمة في مشروعك على Google Cloud.
  2. تأكَّد من أنّ حساب الخدمة هذا لديه إذن الوصول إلى BigQuery في المشروع على السحابة الإلكترونية.
    • أدوار "إدارة الهوية وإمكانية الوصول" (IAM) المطلوبة: Firebase Admin
  3. نزِّل ملف JSON للحصول على مفاتيح حسابات الخدمة. تخزين المحتوى في خصائص النصوص البرمجية لمشروع الموصِّل. بعد إضافة من المفترض أن تبدو مشابهة لما يلي في واجهة مستخدم "برمجة تطبيقات Google":
    حفظ مفاتيح حساب الخدمة في "خصائص النص البرمجي"
  4. تضمين مكتبة OAuth2 لبرمجة التطبيقات في مشروع "برمجة تطبيقات Google"
  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 والكتابة إليها. قاعدة بيانات الوقت الفعلي. تنفذ التعليمة البرمجية التالية الطرق اللازمة بالوصول إلى واجهة برمجة التطبيقات هذه.

تنفيذ الطريقة 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. إنشاء مفتاح فريد لتخزين الحد الأدنى من وحدة البيانات في ذاكرة التخزين المؤقت
    بالنسبة إلى نموذج التنفيذ، يتم استخدام zipcode من configparams. كمفتاح.
    اختياري: بالنسبة إلى ذاكرة التخزين المؤقت لكل مستخدم، يمكنك إنشاء مفتاح مركب باستخدام المفتاح الأساسي هوية المستخدم. مثال على عملية التنفيذ:
    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 لوحة البيانات استنادًا إلى BigQuery بحجم يقارب 20 غيغابايت إلى آلاف المستخدمين. يستخدم هذا الموصِّل "قاعدة بيانات Firebase في الوقت الفعلي" بالإضافة إلى خدمة ذاكرة التخزين المؤقت لبرمجة التطبيقات لتوفير خيار التخزين المؤقت المكوّن من طبقتين. عرض للحصول على تفاصيل التنفيذ.