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

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

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

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

জীবনচক্র ইভেন্ট ট্রিগারের আরও কিছু ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত রয়েছে:

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

স্বল্প-চলমান জীবনচক্র ইভেন্ট হ্যান্ডলার

যদি আপনার টাস্কটি সর্বোচ্চ Cloud Functions সময়কালের মধ্যে সম্পূর্ণরূপে চলতে পারে (প্রথম প্রজন্মের API ব্যবহার করে 9 মিনিট), তাহলে আপনি আপনার লাইফসাইকেল ইভেন্ট হ্যান্ডলারটি একটি একক ফাংশন হিসাবে লিখতে পারেন যা টাস্ক কিউ 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 সময়কালের মধ্যে সম্পন্ন করতে না পারে, তাহলে কাজটিকে সাবটাস্কে ভাগ করুন এবং অ্যাডমিন SDK এর 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 এ ফাংশনটি যোগ করুন।

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

যখন আপনার সমস্ত প্রক্রিয়াকরণ ফাংশন সফলভাবে অথবা ত্রুটি সহকারে সম্পন্ন হয়, তখন অ্যাডমিন SDK এর এক্সটেনশন রানটাইম পদ্ধতি ব্যবহার করে টাস্কের অবস্থা রিপোর্ট করুন। ব্যবহারকারীরা 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

এই প্যারামিটারগুলির বিশদ বিবরণের জন্য Google Cloud ডক্সে Cloud Tasks queue কনফিগার করুন দেখুন।

টাস্ক কিউ প্যারামিটারগুলিকে 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 এক্সটেনশনগুলি ডেটা ব্যাকফিল করার জন্য লাইফসাইকেল ইভেন্ট হ্যান্ডলার ব্যবহার করে।