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

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

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

דרישות

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

מגבלות

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

פתרון

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

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