ফায়ারবেসের সাথে ক্যাশে

ডেটা স্টুডিও-র রিপোর্টের জন্য নিজস্ব ক্যাশ সিস্টেম রয়েছে। আপনার কানেক্টর তৈরি করার সময়, আপনি দ্রুততর রিপোর্টের সুবিধা পেতে এবং এপিআর রেট-লিমিট এড়াতে একটি কাস্টম ক্যাশ প্রয়োগ করতে পারেন।

উদাহরণস্বরূপ, আপনি এমন একটি কানেক্টর তৈরি করছেন যা একটি নির্দিষ্ট জিপ কোডের জন্য গত ৭ দিনের ঐতিহাসিক আবহাওয়ার ডেটা সরবরাহ করে। আপনার কানেক্টরটি বেশ জনপ্রিয় হয়ে উঠছে, কিন্তু আপনি যে এক্সটার্নাল এপিআই থেকে ডেটা আনছেন, সেটির কঠোর রেট লিমিট রয়েছে। এপিআইটি শুধুমাত্র দৈনিক ভিত্তিতে তার ডেটা আপডেট করে, তাই একটি নির্দিষ্ট জিপ কোডের জন্য দিনের মধ্যে একই ডেটা একাধিকবার আনার কোনো প্রয়োজন নেই। এই সলিউশন গাইডটি ব্যবহার করে, আপনি প্রতিটি জিপ কোডের জন্য একটি দৈনিক ক্যাশে ইমপ্লিমেন্ট করতে পারেন।

প্রয়োজনীয়তা

  • একটি ফায়ারবেস রিয়েলটাইম ডেটাবেস । যদি আপনার কাছে এর অ্যাক্সেস না থাকে, তাহলে একটি গুগল ক্লাউড প্ল্যাটফর্ম (GCP) প্রজেক্ট তৈরি করুন এবং আপনার নিজস্ব ফায়ারবেস রিয়েলটাইম ডেটাবেস ইনস্ট্যান্স তৈরি করতে 'গেট স্টার্টেড' গাইডটি অনুসরণ করুন।
  • ফায়ারবেস রিয়েলটাইম ডেটাবেস থেকে ডেটা পড়া এবং লেখার জন্য একটি GCP সার্ভিস অ্যাকাউন্ট।
  • একটি কমিউনিটি কানেক্টর যা কোনো উৎস থেকে ডেটা সংগ্রহ করে।

সীমাবদ্ধতা

  • এই সমাধানটি [ডেটা স্টুডিও অ্যাডভান্সড সার্ভিসেস]-এর সাথে ব্যবহার করা যাবে না। আপনি যখন ডেটা স্টুডিও অ্যাডভান্সড সার্ভিসেস ব্যবহার করেন, তখন অ্যাপস স্ক্রিপ্টে থাকা আপনার কানেক্টর কোড ডেটা অ্যাক্সেস করতে পারে না। ফলে আপনি অ্যাপস স্ক্রিপ্ট ব্যবহার করে ডেটা ক্যাশ করতে পারবেন না।
  • রিপোর্ট সম্পাদক ও দর্শকরা এই নির্দিষ্ট ক্যাশে রিসেট করতে পারবেন না।

সমাধান

একটি পরিষেবা অ্যাকাউন্ট বাস্তবায়ন করুন

  1. আপনার গুগল ক্লাউড প্রজেক্টে একটি সার্ভিস অ্যাকাউন্ট তৈরি করুন
  2. নিশ্চিত করুন যে এই সার্ভিস অ্যাকাউন্টটির ক্লাউড প্রজেক্টে BigQuery অ্যাক্সেস আছে।
    • প্রয়োজনীয় আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM) রোল: Firebase Admin
  3. সার্ভিস অ্যাকাউন্ট কীগুলো পেতে JSON ফাইলটি ডাউনলোড করুন। ফাইলটির বিষয়বস্তু আপনার কানেক্টর প্রজেক্টের স্ক্রিপ্ট প্রপার্টিজে সংরক্ষণ করুন। কীগুলো যোগ করার পর, অ্যাপস স্ক্রিপ্ট UI-তে এটি দেখতে অনেকটা এইরকম হবে:
    স্ক্রিপ্ট প্রোপার্টিজে সার্ভিস অ্যাকাউন্ট কী সংরক্ষণ করা
  4. আপনার অ্যাপস স্ক্রিপ্ট প্রজেক্টে 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'
    ]);
}

ফায়ারবেস থেকে ডেটা পড়া এবং লেখার জন্য কোড প্রয়োগ করুন।

আপনি একটি ফায়ারবেস রিয়েলটাইম ডেটাবেসে ডেটা পড়া এবং লেখার জন্য ফায়ারবেস ডেটাবেস REST API ব্যবহার করবেন। নিম্নলিখিত কোডটি এই 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 key হিসেবে ব্যবহার করা হচ্ছে।
    ঐচ্ছিক : ব্যবহারকারী-ভিত্তিক ক্যাশের জন্য, বেস কী এবং ব্যবহারকারীর আইডেন্টিটি দিয়ে একটি কম্পোজিট কী তৈরি করুন। বাস্তবায়নের উদাহরণ:
    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() কোড অন্তর্ভুক্ত করা হয়েছে।

উদাহরণ কোড

অতিরিক্ত সম্পদ

ক্রোম ইউএক্স কানেক্টরটি প্রায় ২০ জিবি বিগকোয়েরি টেবিলের উপর ভিত্তি করে হাজার হাজার ব্যবহারকারীর জন্য একটি ড্যাশবোর্ড সরবরাহ করে। এই কানেক্টরটি দ্বি-স্তরীয় ক্যাশিং পদ্ধতির জন্য ফায়ারবেস রিয়েলটাইম ডেটাবেস এবং অ্যাপস স্ক্রিপ্ট ক্যাশ সার্ভিস ব্যবহার করে। বাস্তবায়নের বিস্তারিত জানতে কোড দেখুন।