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

আপনার এক্সটেনশনে 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 ক্লাউড ডক্সে ক্লাউড টাস্ক সারিগুলি কনফিগার করুন দেখুন৷

টাস্ক কিউ প্যারামিটারগুলিকে 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.yamltaskQueueTrigger প্রপার্টি হল একটি এক্সটেনশনের টাস্ক কিউ কনফিগার করার একমাত্র উপায়।

উদাহরণ

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