שמירה במטמון באמצעות Firebase

ל-Looker Studio יש מערכת מטמון משלו לדוחות. כשיוצרים את המחבר, אפשר להטמיע מטמון בהתאמה אישית כדי להפיק דוחות מהר יותר ולהימנע מהגבלות קצב של APR.

לדוגמה, אתם יוצרים מחבר שמספק נתוני מזג אוויר היסטוריים מ-7 הימים האחרונים עבור מיקוד ספציפי. המחבר שלכם הופך לפופולרי מאוד, אבל ל-API החיצוני שממנו אתם מאחזרים את הנתונים יש מגבלות קפדניות על קצב הבקשות. ה-API מעדכן את הנתונים שלו רק פעם ביום, כך שאין צורך לאחזר את אותם נתונים כמה פעמים ביום עבור מיקוד ספציפי. בעזרת המדריך הזה, תוכלו להטמיע מטמון יומי לכל מיקוד.

דרישות

  • מסד נתונים בזמן אמת ב-Firebase. אם אין לכם גישה לפרויקט כזה, אתם יכולים ליצור פרויקט ב-Google Cloud Platform‏ (GCP) ולפעול לפי השלבים במדריך תחילת העבודה כדי ליצור מופע משלכם של Firebase Realtime Database.
  • חשבון שירות של GCP לקריאה ולכתיבה של נתונים מ-Firebase Realtime Database.
  • מחבר של הקהילה שמביא נתונים ממקור.

מגבלות

  • אי אפשר להשתמש בפתרון הזה עם שירותים מתקדמים של Looker Studio. כשמשתמשים ב-Looker Studio Advanced Services, לקוד המחבר ב-Apps Script אין גישה לנתונים. לכן אי אפשר לשמור את הנתונים במטמון באמצעות Apps Script.
  • עורכים וצופים בדוחות לא יכולים לאפס את המטמון הספציפי הזה.

פתרון

הטמעה של חשבון שירות

  1. יוצרים חשבון שירות בפרויקט Google Cloud.
  2. מוודאים שלחשבון השירות הזה יש גישה ל-BigQuery בפרויקט בענן.
    • תפקידים נדרשים בניהול זהויות והרשאות גישה (IAM): Firebase Admin
  3. מורידים את קובץ ה-JSON כדי לקבל את המפתחות של חשבונות השירות. מאחסנים את התוכן של הקובץ במאפייני הסקריפט של פרויקט המחבר. אחרי הוספת המפתחות, הם אמורים להיראות כך בממשק המשתמש של Apps Script:
    שמירת מפתחות של חשבונות שירות במאפייני סקריפט
  4. כוללים את ספריית OAuth2 for Apps Script בפרויקט 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. יוצרים מפתח ייחודי לאחסון יחידת הנתונים המינימלית במטמון.
    בדוגמה להטמעה, נעשה שימוש ב-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‏ (CrUX) מאפשר ליצור לוח בקרה שמבוסס על טבלת BigQuery בגודל של כ-20GB, עבור אלפי משתמשים. המחבר הזה משתמש ב-Firebase Realtime Database יחד עם Apps Script Cache Service לגישה לשמירת נתונים במטמון בשתי שכבות. פרטים על ההטמעה זמינים בקוד.