आपके एक्सटेंशन में 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
फ़ाइल में, ये काम करें:
अपने फ़ंक्शन को
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: {}
एक या उससे ज़्यादा लाइफ़साइकल इवेंट के लिए, अपने फ़ंक्शन को हैंडलर के तौर पर रजिस्टर करें:
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
. ये सभी इवेंट ज़रूरी नहीं हैं.setProcessingState()
को कॉल करें.इसका सुझाव दिया जाता है: अगर आपके एक्सटेंशन के काम करने के लिए प्रोसेसिंग टास्क की ज़रूरत नहीं है, तो उपयोगकर्ता का कॉन्फ़िगर किया गया पैरामीटर जोड़ें. इससे उपयोगकर्ता यह चुन पाएंगे कि उसे चालू करना है या नहीं.
उदाहरण के लिए, इस तरह का पैरामीटर जोड़ें:
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}.` ); अगर आपको ऐसी गड़बड़ियों की शिकायत करनी है जो एक्सटेंशन को इस्तेमाल के लायक नहीं हैं, तो
|
NONE |
टास्क की स्थिति मिटाने के लिए इसका इस्तेमाल करें. इसके अलावा, कंसोल से स्थिति की जानकारी देने वाले मैसेज को हटाने के लिए भी, वैकल्पिक रूप से इसका इस्तेमाल किया जा सकता है (उदाहरण के लिए, getExtensions().runtime().setProcessingState("NONE"); |
गंभीर गड़बड़ियां
अगर कोई ऐसी गड़बड़ी होती है जो एक्सटेंशन को काम करने से रोकती है, तो setFatalError()
की मदद से गंभीर गड़बड़ी की शिकायत करें. उदाहरण के लिए, सेट अप करने का कोई ज़रूरी टास्क न होना:
import { getExtensions } from "firebase-admin/extensions";
// ...
getExtensions().runtime().setFatalError(`Post-installation setup failed. ${errorMessage}`);
टास्क सूची को ट्यून किया जा रहा है
अगर taskQueueTrigger
प्रॉपर्टी को {}
पर सेट किया जाता है, तो एक्सटेंशन इंस्टेंस इंस्टॉल होने पर आपका एक्सटेंशन, डिफ़ॉल्ट सेटिंग के साथ Cloud Tasks की सूची को प्रावधान करेगा. इसके अलावा, टास्क सूची के एक साथ कई काम करने की सीमाओं में बदलाव किया जा सकता है.
साथ ही, खास वैल्यू देकर, टास्क की फिर से प्रोसेस करने की कोशिश की जा सकती है:
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 के दस्तावेज़ में क्लाउड टास्क की सूचियां कॉन्फ़िगर करना देखें.
टास्क सूची के पैरामीटर को 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
सभी एक्सटेंशन, डेटा बैकफ़िल करने के लिए लाइफ़साइकल इवेंट हैंडलर का इस्तेमाल करते हैं.