আপনার এক্সটেনশনের জীবনচক্র ইভেন্টগুলি পরিচালনা করুন৷

আপনার এক্সটেনশনে Cloud Tasks ফাংশন অন্তর্ভুক্ত থাকতে পারে, যা কোনো এক্সটেনশন ইনস্ট্যান্স নিম্নলিখিত লাইফসাইকেল ইভেন্টগুলোর যেকোনো একটির মধ্য দিয়ে গেলে ট্রিগার হয়:

  • এক্সটেনশনটির একটি ইনস্ট্যান্স ইনস্টল করা আছে
  • এক্সটেনশনটির একটি ইনস্ট্যান্স একটি নতুন সংস্করণে আপডেট করা হয়েছে।
  • একটি এক্সটেনশন ইনস্ট্যান্সের কনফিগারেশন পরিবর্তন করা হয়েছে

এই ফিচারের অন্যতম গুরুত্বপূর্ণ একটি ব্যবহার হলো ডেটা ব্যাকফিলিং । উদাহরণস্বরূপ, ধরুন আপনি এমন একটি এক্সটেনশন তৈরি করছেন যা Cloud Storage বাকেটে আপলোড করা ছবিগুলোর থাম্বনেইল প্রিভিউ তৈরি করে। আপনার এক্সটেনশনের মূল কাজটি onFinalize Cloud Storage ইভেন্ট দ্বারা ট্রিগার হওয়া একটি ফাংশনের মধ্যে সম্পন্ন হবে। কিন্তু, শুধুমাত্র এক্সটেনশনটি ইনস্টল হওয়ার পরে আপলোড করা ছবিগুলোই প্রসেস করা হবে। আপনার এক্সটেনশনে onInstall লাইফসাইকেল ইভেন্ট দ্বারা ট্রিগার হওয়া একটি ফাংশন অন্তর্ভুক্ত করার মাধ্যমে, এক্সটেনশনটি ইনস্টল হওয়ার সময়ে আপনি বিদ্যমান যেকোনো ছবিরও থাম্বনেইল প্রিভিউ তৈরি করতে পারবেন।

লাইফসাইকেল ইভেন্ট ট্রিগারের আরও কিছু ব্যবহার হলো:

  • ইনস্টলেশন-পরবর্তী সেটআপ স্বয়ংক্রিয় করুন (ডাটাবেস রেকর্ড তৈরি, ইন্ডেক্সিং, ইত্যাদি)।
  • যদি আপনাকে পূর্ববর্তী সংস্করণের সাথে অসামঞ্জস্যপূর্ণ পরিবর্তন প্রকাশ করতে হয়, তাহলে আপডেটের সময় স্বয়ংক্রিয়ভাবে ডেটা স্থানান্তর করুন।

স্বল্পস্থায়ী লাইফসাইকেল ইভেন্ট হ্যান্ডলার

যদি আপনার টাস্কটি Cloud Functions সর্বোচ্চ সময়সীমার (প্রথম প্রজন্মের এপিআই ব্যবহার করে ৯ মিনিট) মধ্যে সম্পূর্ণরূপে চলতে পারে, তাহলে আপনি আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলারটিকে একটি একক ফাংশন হিসাবে লিখতে পারেন যা টাস্ক কিউ-এর onDispatch ইভেন্টে ট্রিগার হয়:

export const myTaskFunction = functions.tasks.taskQueue()
  .onDispatch(async () => {
    // Complete your lifecycle event handling task.
    // ...

    // When processing is complete, report status to the user (see below).
  });

এরপর, আপনার এক্সটেনশনের extension.yaml ফাইলে নিম্নলিখিত কাজগুলো করুন:

  1. taskQueueTrigger প্রপার্টি সেট করে আপনার ফাংশনটিকে একটি এক্সটেনশন রিসোর্স হিসেবে রেজিস্টার করুন। যদি আপনি taskQueueTrigger একটি খালি ম্যাপ ( {} ) হিসেবে সেট করেন, তাহলে আপনার এক্সটেনশনটি ডিফল্ট সেটিংস ব্যবহার করে একটি Cloud Tasks কিউ তৈরি করবে; আপনি চাইলে এই সেটিংসগুলো নিজের মতো করে পরিবর্তন করতে পারেন।

    resources:
      - name: myTaskFunction
        type: firebaseextensions.v1beta.function
        description: >-
          Describe the task performed when the function is triggered by a lifecycle
          event
        properties:
          location: ${LOCATION}
          taskQueueTrigger: {}
    
  2. আপনার ফাংশনটিকে এক বা একাধিক লাইফসাইকেল ইভেন্টের হ্যান্ডলার হিসেবে নিবন্ধন করুন:

    resources:
      - ...
    lifecycleEvents:
      onInstall:
        function: myTaskFunction
        processingMessage: Resizing your existing images
      onUpdate:
        function: myOtherTaskFunction
        processingMessage: Setting up your extension
      onConfigure:
        function: myOtherTaskFunction
        processingMessage: Setting up your extension
    
    

    আপনি নিম্নলিখিত ইভেন্টগুলির যেকোনোটির জন্য ফাংশন নিবন্ধন করতে পারেন: onInstall , onUpdate , এবং onConfigure । এই সমস্ত ইভেন্ট ঐচ্ছিক।

  3. পরামর্শ : যদি আপনার এক্সটেনশনটি কাজ করার জন্য প্রসেসিং টাস্কটির প্রয়োজন না হয়, তাহলে একটি ইউজার-কনফিগারেশন প্যারামিটার যোগ করুন যা ব্যবহারকারীদের এটি চালু করবেন কিনা তা বেছে নেওয়ার সুযোগ দেবে।

    উদাহরণস্বরূপ, নিচের মতো একটি প্যারামিটার যোগ করুন:

    params:
      - param: DO_BACKFILL
        label: Backfill existing images
        description: >
          Should existing, unresized images in the Storage bucket be resized as well?
        type: select
        options:
          - label: Yes
            value: true
          - label: No
            value: false
    

    এবং আপনার ফাংশনে, যদি প্যারামিটারটি false সেট করা থাকে, তাহলে তাড়াতাড়ি বেরিয়ে যান:

    export const myTaskFunction = functions.tasks.taskQueue()
      .onDispatch(async () => {
        if (!process.env.DO_BACKFILL) {
          await runtime.setProcessingState(
            "PROCESSING_COMPLETE",
            "Existing images were not resized."
          );
          return;
        }
        // Complete your lifecycle event handling task.
        // ...
      });
    

দীর্ঘস্থায়ী কাজ সম্পাদন করা

যদি আপনার টাস্কটি Cloud Functions সর্বোচ্চ সময়সীমার মধ্যে সম্পন্ন করা না যায়, তবে টাস্কটিকে কয়েকটি উপ-টাস্কে ভাগ করুন এবং অ্যাডমিন এসডিকে-এর TaskQueue.enqueue() মেথড ব্যবহার করে জবগুলোকে কিউতে যুক্ত করে ক্রমানুসারে প্রতিটি উপ-টাস্ক সম্পাদন করুন।

উদাহরণস্বরূপ, ধরুন আপনি Cloud Firestore ডেটা ব্যাকফিল করতে চান। আপনি কোয়েরি কার্সার ব্যবহার করে ডকুমেন্ট কালেকশনটিকে খণ্ডে বিভক্ত করতে পারেন। একটি খণ্ড প্রসেস করার পর, শুরুর অফসেটটি এগিয়ে দিন এবং নিচে দেখানো অনুযায়ী আরেকটি ফাংশন ইনভোকেশন কিউতে যুক্ত করুন:

import { getFirestore } from "firebase-admin/firestore";
import { getFunctions } from "firebase-admin/functions";

exports.backfilldata = functions.tasks.taskQueue().onDispatch(async (data) => {
  // When a lifecycle event triggers this function, it doesn't pass any data,
  // so an undefined offset indicates we're on our first invocation and should
  // start at offset 0. On subsequent invocations, we'll pass an explicit
  // offset.
  const offset = data["offset"] ?? 0;

  // Get a batch of documents, beginning at the offset.
  const snapshot = await getFirestore()
    .collection(process.env.COLLECTION_PATH)
    .startAt(offset)
    .limit(DOCS_PER_BACKFILL)
    .get();
  // Process each document in the batch.
  const processed = await Promise.allSettled(
    snapshot.docs.map(async (documentSnapshot) => {
      // Perform the processing.
    })
  );

  // If we processed a full batch, there are probably more documents to
  // process, so enqueue another invocation of this function, specifying
  // the offset to start with.
  //
  // If we processed less than a full batch, we're done.
  if (processed.length == DOCS_PER_BACKFILL) {
    const queue = getFunctions().taskQueue(
      "backfilldata",
      process.env.EXT_INSTANCE_ID
    );
    await queue.enqueue({
      offset: offset + DOCS_PER_BACKFILL,
    });
  } else {
      // Processing is complete. Report status to the user (see below).
  }
});

পূর্ববর্তী বিভাগে বর্ণিত পদ্ধতি অনুযায়ী আপনার extension.yaml এ ফাংশনটি যোগ করুন।

রিপোর্টিং স্ট্যাটাস

আপনার সমস্ত প্রসেসিং ফাংশন সফলভাবে বা ত্রুটিসহ শেষ হলে, অ্যাডমিন এসডিকে-এর এক্সটেনশন রানটাইম মেথড ব্যবহার করে টাস্কটির স্ট্যাটাস রিপোর্ট করুন। ব্যবহারকারীরা Firebase কনসোলের এক্সটেনশন ডিটেইলস পেজে এই স্ট্যাটাসটি দেখতে পারেন।

সফল সমাপ্তি এবং অ-মারাত্মক ত্রুটি

সফলভাবে কাজ সম্পন্ন হওয়া এবং মারাত্মক নয় এমন ত্রুটি (যেসব ত্রুটির কারণে এক্সটেনশনটি অকার্যকর হয়ে পড়ে না) রিপোর্ট করার জন্য, অ্যাডমিন SDK-এর setProcessingState() এক্সটেনশন রানটাইম মেথডটি ব্যবহার করুন:

import { getExtensions } from "firebase-admin/extensions";

// ...

getExtensions().runtime().setProcessingState(processingState, message);

আপনি নিম্নলিখিত অবস্থাগুলো নির্ধারণ করতে পারেন:

অ-মারাত্মক অবস্থা
PROCESSING_COMPLETE

কাজ সফলভাবে সম্পন্ন হওয়ার প্রতিবেদন দিতে ব্যবহার করুন। উদাহরণ:

getExtensions().runtime().setProcessingState(
  "PROCESSING_COMPLETE",
  `Backfill complete. Successfully processed ${numSuccess} documents.`
);
PROCESSING_WARNING

আংশিক সাফল্য জানাতে ব্যবহার করুন। উদাহরণ:

getExtensions().runtime().setProcessingState(
  "PROCESSING_WARNING",
  `Backfill complete. ${numSuccess} documents processed successfully.`
    + ` ${numFailed} documents failed to process. ${listOfErrors}.`
    + ` ${instructionsToFixTheProblem}`
);
PROCESSING_FAILED

এমন ত্রুটি রিপোর্ট করতে ব্যবহার করুন যা কাজটি সম্পন্ন হতে বাধা দেয়, কিন্তু এক্সটেনশনটিকে অব্যবহারযোগ্য করে তোলে না। উদাহরণ:

getExtensions().runtime().setProcessingState(
  "PROCESSING_FAILED",
  `Backfill failed. ${errorMsg} ${optionalInstructionsToFixTheProblem}.`
);

যেসব ত্রুটির কারণে এক্সটেনশনটি ব্যবহার অযোগ্য হয়ে পড়ে , সেগুলো রিপোর্ট করতে setFatalError() কল করুন।

NONE

টাস্কের স্ট্যাটাস মুছে ফেলতে ব্যবহার করুন। আপনি চাইলে কনসোল থেকে স্ট্যাটাস মেসেজটি মুছে ফেলার জন্যও এটি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, PROCESSING_COMPLETE সেট করার পর কিছু সময় অতিবাহিত হলে)। উদাহরণ:

getExtensions().runtime().setProcessingState("NONE");

মারাত্মক ত্রুটি

যদি এমন কোনো ত্রুটি ঘটে যা এক্সটেনশনটিকে কাজ করতে বাধা দেয়—উদাহরণস্বরূপ, কোনো প্রয়োজনীয় সেটআপ টাস্ক ব্যর্থ হলে— setFatalError() ব্যবহার করে মারাত্মক ত্রুটিটি রিপোর্ট করুন:

import { getExtensions } from "firebase-admin/extensions";

// ...

getExtensions().runtime().setFatalError(`Post-installation setup failed. ${errorMessage}`);

টাস্ক কিউ টিউনিং

আপনি যদি taskQueueTrigger প্রপার্টিটি {} -তে সেট করেন, তাহলে একটি এক্সটেনশন ইনস্ট্যান্স ইনস্টল করার সময় আপনার এক্সটেনশনটি ডিফল্ট সেটিংস সহ একটি ক্লাউড টাস্ক কিউ তৈরি করবে। বিকল্পভাবে, আপনি নির্দিষ্ট মান প্রদান করে টাস্ক কিউ-এর কনকারেন্সি লিমিট এবং রিট্রাই আচরণ নিয়ন্ত্রণ করতে পারেন:

resources:
  - name: myTaskFunction
    type: firebaseextensions.v1beta.function
    description: >-
      Perform a task when triggered by a lifecycle event
    properties:
      location: ${LOCATION}
      taskQueueTrigger:
        rateLimits:
          maxConcurrentDispatches: 1000
          maxDispatchesPerSecond: 500
        retryConfig:
          maxAttempts: 100  # Warning: setting this too low can prevent the function from running
          minBackoffSeconds: 0.1
          maxBackoffSeconds: 3600
          maxDoublings: 16
lifecycleEvents:
  onInstall: 
    function: myTaskFunction
    processingMessage: Resizing your existing images
  onUpdate:
    function: myTaskFunction
    processingMessage: Setting up your extension
  onConfigure:
    function: myOtherTaskFunction
    processingMessage: Setting up your extension

এই প্যারামিটারগুলো সম্পর্কে বিস্তারিত জানতে গুগল ক্লাউড ডক্স-এ ‘ক্লাউড টাস্ক কিউ কনফিগার করুন’ দেখুন।

taskQueue() ফাংশনে টাস্ক কিউ প্যারামিটার পাস করে তা নির্দিষ্ট করার চেষ্টা করবেন না। extension.yaml এর কনফিগারেশন এবং ডিফল্ট কনফিগারেশনের কারণে এই সেটিংসগুলো উপেক্ষা করা হয়।

উদাহরণস্বরূপ, এটি কাজ করবে না:

export const myBrokenTaskFunction = functions.tasks
  // DON'T DO THIS IN AN EXTENSION! THESE SETTINGS ARE IGNORED.
  .taskQueue({
    retryConfig: {
      maxAttempts: 5,
      minBackoffSeconds: 60,
    },
    rateLimits: {
      maxConcurrentDispatches: 1000,
      maxDispatchesPerSecond: 10,
    },
  })
  .onDispatch(
    // ...
  );

একটি এক্সটেনশনের টাস্ক কিউ কনফিগার করার একমাত্র উপায় হলো extension.yaml ফাইলের taskQueueTrigger প্রপার্টি।

উদাহরণ

অফিসিয়াল storage-resize-images , firestore-bigquery-export এবং firestore-translate-text এক্সটেনশনগুলো ডেটা ব্যাকফিল করার জন্য লাইফসাইকেল ইভেন্ট হ্যান্ডলার ব্যবহার করে।