Firebase की मदद से कैश मेमोरी

Looker Studio में, रिपोर्ट के लिए अपना कैश सिस्टम होता है. कनेक्टर बनाते समय, कस्टम कैश मेमोरी का इस्तेमाल किया जा सकता है. इससे रिपोर्ट तेज़ी से जनरेट होती हैं और एपीआई कॉल की संख्या पर लगी सीमा का उल्लंघन नहीं होता.

उदाहरण के लिए, आपको एक ऐसा कनेक्टर बनाना है जो किसी पिन कोड के लिए, पिछले सात दिनों का मौसम का डेटा उपलब्ध कराता हो. आपका कनेक्टर काफ़ी लोकप्रिय हो रहा है, लेकिन जिस बाहरी एपीआई से डेटा फ़ेच किया जा रहा है उस पर दर की सीमाएं लागू हैं. यह एपीआई, डेटा को सिर्फ़ हर दिन अपडेट करता है. इसलिए, किसी पिन कोड के लिए, एक दिन में एक ही डेटा को कई बार फ़ेच करने की ज़रूरत नहीं होती. इस समाधान गाइड का इस्तेमाल करके, हर पिन कोड के लिए रोज़ाना कैश मेमोरी लागू की जा सकती है.

ज़रूरी शर्तें

  • Firebase रीयलटाइम डेटाबेस. अगर आपके पास ऐसा कोई प्रोजेक्ट नहीं है, तो Google Cloud Platform (GCP) प्रोजेक्ट बनाएं. इसके बाद, शुरू करें गाइड में दिए गए निर्देशों का पालन करके, अपना Firebase Realtime Database इंस्टेंस बनाएं.
  • Firebase रीयलटाइम डेटाबेस से डेटा पढ़ने और लिखने के लिए, GCP सेवा खाता.
  • ऐसा कम्यूनिटी कनेक्टर जो किसी सोर्स से डेटा फ़ेच करता है.

सीमाएं

  • इस समाधान का इस्तेमाल, Looker Studio की ऐडवांस सेवाओं के साथ नहीं किया जा सकता. Looker Studio की ऐडवांस सेवाओं का इस्तेमाल करने पर, Apps Script में मौजूद आपके कनेक्टर कोड के पास डेटा को ऐक्सेस करने की अनुमति नहीं होती. इसलिए, Apps Script का इस्तेमाल करके डेटा को कैश नहीं किया जा सकता.
  • रिपोर्ट एडिटर और दर्शक, इस कैश मेमोरी को रीसेट नहीं कर सकते.

समाधान

सेवा खाता लागू करना

  1. अपने Google Cloud प्रोजेक्ट में, सेवा खाता बनाएं.
  2. पक्का करें कि इस सेवा खाते के पास, Cloud प्रोजेक्ट में BigQuery का ऐक्सेस हो.
    • पहचान और ऐक्सेस मैनेजमेंट (आईएएम) की ज़रूरी भूमिकाएं: Firebase Admin
  3. सेवा खातों की कुंजियां पाने के लिए, JSON फ़ाइल डाउनलोड करें. फ़ाइल के कॉन्टेंट को, कनेक्टर प्रोजेक्ट की स्क्रिप्ट प्रॉपर्टी में सेव करें. कुंजियां जोड़ने के बाद, Apps Script के यूज़र इंटरफ़ेस (यूआई) में यह इस तरह दिखनी चाहिए:
    स्क्रिप्ट प्रॉपर्टी में सेवा खाते की कुंजियां सेव करना
  4. अपने Apps Script प्रोजेक्ट में, OAuth2 for 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 Realtime Database में डेटा पढ़ने और लिखने के लिए, Firebase Database REST 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. कैश मेमोरी में डेटा की सबसे छोटी यूनिट को सेव करने के लिए, एक यूनीक कुंजी बनाएं.
    लागू करने के उदाहरण के लिए, configparams से zipcode का इस्तेमाल कुंजी के तौर पर किया जा रहा है.
    ज़रूरी नहीं: हर उपयोगकर्ता के लिए कैश मेमोरी बनाने के लिए, बेस कुंजी और उपयोगकर्ता की पहचान का इस्तेमाल करके कंपोज़िट कुंजी बनाएं. लागू करने का उदाहरण:
    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 कनेक्टर, हज़ारों उपयोगकर्ताओं को ~20 जीबी की BigQuery टेबल पर आधारित डैशबोर्ड उपलब्ध कराता है. यह कनेक्टर, दो लेयर वाली कैश मेमोरी की सुविधा के लिए, Firebase Realtime Database के साथ-साथ Apps Script Cache Service का इस्तेमाल करता है. लागू करने से जुड़ी जानकारी के लिए, कोड देखें.