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

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

  • An instance of the extension is installed
  • এক্সটেনশনের একটি উদাহরণ একটি নতুন সংস্করণে আপডেট করা হয়েছে
  • An extension instance's configuration is changed

এই বৈশিষ্ট্যটির সবচেয়ে গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে একটি হল ব্যাকফিলিং ডেটা । উদাহরণস্বরূপ, ধরুন আপনি একটি এক্সটেনশন তৈরি করছেন যা একটি Cloud Storage বালতিতে আপলোড করা চিত্রগুলির থাম্বনেইল পূর্বরূপ তৈরি করে৷ আপনার এক্সটেনশনের প্রধান কাজটি onFinalize Cloud Storage ইভেন্ট দ্বারা ট্রিগার করা একটি ফাংশনে করা হবে। যাইহোক, শুধুমাত্র এক্সটেনশন ইনস্টল করার পরে আপলোড করা ছবিগুলি প্রক্রিয়া করা হবে৷ By including in your extension a function triggered by the onInstall lifecycle event, you could also generate thumbnail previews of any existing images when the extension is installed.

লাইফসাইকেল ইভেন্ট ট্রিগারের কিছু অন্যান্য ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত:

  • স্বয়ংক্রিয় পোস্ট-ইন্সটল সেটআপ (ডাটাবেস রেকর্ড তৈরি করা, ইন্ডেক্সিং ইত্যাদি)
  • যদি আপনাকে পিছনের দিকে-বেমানান পরিবর্তনগুলি প্রকাশ করতে হয়, আপডেটে স্বয়ংক্রিয়ভাবে ডেটা স্থানান্তর করুন৷

Short-running lifecycle event handlers

If your task can run completely within the maximum Cloud Functions duration (9 minutes using the first-generation API), you can write your lifecycle event handler as a single function that triggers on the task queue onDispatch event:

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 । এই সমস্ত ইভেন্ট al চ্ছিক।

  3. Recommended : If the processing task isn't required for your extension to work, add a user-configured parameter that lets users choose whether to enable it.

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

    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
    

    And in your function, if the parameter is set to false , exit early:

    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 ফাংশনটি যুক্ত করুন।

Reporting status

যখন আপনার সমস্ত প্রসেসিং ফাংশন শেষ হয়, সফলভাবে বা কোনও ত্রুটি সহ, অ্যাডমিন এসডিকে এক্সটেনশন রানটাইম পদ্ধতিগুলি ব্যবহার করে টাস্কের স্থিতি প্রতিবেদন করুন। Users can see this status on the extension details page in the Firebase console.

Successful completion and non-fatal errors

সফল সমাপ্তি এবং অ-মারাত্মক ত্রুটিগুলি (ত্রুটিগুলি যা এক্সটেনশনটিকে একটি অ-কার্যকরী অবস্থায় রাখে না) প্রতিবেদন করতে, অ্যাডমিন এসডিকে এর setProcessingState() এক্সটেনশন রানটাইম পদ্ধতিটি ব্যবহার করুন:

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

// ...

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

You can set the following states:

Non-fatal states
PROCESSING_COMPLETE

Use to report successful task completion. উদাহরণ:

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

Use to report partial success. উদাহরণ:

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

Use to clear the task's status. কনসোল থেকে স্থিতি বার্তাটি সাফ করার জন্য আপনি এটি বিকল্পভাবে ব্যবহার করতে পারেন (উদাহরণস্বরূপ, PROCESSING_COMPLETE সেট করার পরে কিছুটা সময় পেরিয়ে যাওয়ার পরে)। উদাহরণ:

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

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

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

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

// ...

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

Tuning the task queue

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

উদাহরণ

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