टास्क की सूची वाले फ़ंक्शन, Google Cloud Tasks का इस्तेमाल करते हैं. इससे आपके ऐप्लिकेशन के मुख्य ऐप्लिकेशन फ़्लो के बाहर, एसिंक्रोनस तरीके से ज़्यादा समय लेने वाले, ज़्यादा संसाधन वाले या सीमित बैंडविथ वाले काम करने में मदद मिलती है.
उदाहरण के लिए, मान लें कि आपको इमेज फ़ाइलों के एक बड़े सेट के बैकअप बनाने हैं, जो फ़िलहाल दर की सीमा वाले एपीआई पर होस्ट किए जा रहे हैं. उस एपीआई का ज़िम्मेदार उपभोक्ता बनने के लिए, आपको उसकी दर से जुड़ी सीमाओं का पालन करना होगा. साथ ही, टाइम आउट और मेमोरी की सीमाओं की वजह से, लंबे समय तक चलने वाले इस काम के फ़ेल होने का जोखिम हो सकता है.
इस जटिलता को कम करने के लिए, टास्क की सूची वाला फ़ंक्शन लिखा जा सकता है. यह फ़ंक्शन, scheduleTime
और dispatchDeadline
जैसे टास्क के बुनियादी विकल्प सेट करता है. इसके बाद, Cloud Tasks में फ़ंक्शन को सूची में भेज देता है. Cloud Tasks के एनवायरमेंट को खास तौर पर इस तरह से डिज़ाइन किया गया है कि इस तरह के ऑपरेशन के लिए, ट्रैफ़िक कंट्रोल और फिर से कोशिश करने की नीतियों को असरदार तरीके से लागू किया जा सके.
टास्क सूची के फ़ंक्शन के साथ काम करने के लिए, यह Firebase SDK टूल, Cloud Functions for Firebase के v3.20.1 और इसके बाद के वर्शन के साथ काम करता है. साथ ही, यह Firebase Admin SDK v10.2.0 और इसके बाद के वर्शन के साथ काम करता है.
Firebase के साथ टास्क कतार फ़ंक्शन का इस्तेमाल करने पर, Cloud Tasks प्रोसेसिंग के लिए शुल्क लिया जा सकता है. ज़्यादा जानकारी के लिए, Cloud Tasks कीमत देखें.
टास्क की सूची बनाने वाले फ़ंक्शन बनाना
टास्क सूची के फ़ंक्शन का इस्तेमाल करने के लिए, यह वर्कफ़्लो अपनाएं:
- Cloud Functions के लिए Firebase SDK टूल का इस्तेमाल करके, टास्क कतार फ़ंक्शन लिखें.
- अपने फ़ंक्शन को एचटीटीपी अनुरोध से ट्रिगर करके टेस्ट करें.
- Firebase सीएलआई की मदद से, अपना फ़ंक्शन डिप्लॉय करें. टास्क सूची के फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में टास्क सूची बनाएगा. इसमें, आपके सोर्स कोड में बताए गए विकल्प (दर को सीमित करना और फिर से कोशिश करना) शामिल होंगे.
- ज़रूरत पड़ने पर, टास्क को लागू करने का शेड्यूल सेट अप करने के लिए पैरामीटर पास करके, नई बनाई गई टास्क सूची में टास्क जोड़ें. ऐसा करने के लिए, Admin SDK का इस्तेमाल करके कोड लिखें और उसे Cloud Functions for Firebase में डिप्लॉय करें.
टास्क सूची के फ़ंक्शन लिखें
टास्क की सूची के फ़ंक्शन लिखने के लिए, onDispatch
का इस्तेमाल करें. टास्क कतार फ़ंक्शन लिखने का एक अहम हिस्सा, हर कतार के लिए फिर से कोशिश करने और दर को सीमित करने वाला कॉन्फ़िगरेशन सेट करना है. इस पेज पर दिए गए कोड सैंपल, एक ऐसे ऐप्लिकेशन पर आधारित हैं जो एक सेवा सेट अप करता है. यह सेवा, नासा के आस्ट्रोनॉमी पिक्चर ऑफ़ द डे से सभी इमेज का बैक अप लेती है:
टास्क की सूची के फ़ंक्शन कॉन्फ़िगर करना
टास्क सूची के फ़ंक्शन, कॉन्फ़िगरेशन सेटिंग के बेहतरीन सेट के साथ आते हैं. इनसे, टास्क सूची की दर की सीमाओं और फिर से कोशिश करने के व्यवहार को सटीक तरीके से कंट्रोल किया जा सकता है:
exports.backupApod = functions
.runWith( {secrets: ["NASA_API_KEY"]})
.tasks.taskQueue({
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}).onDispatch(async (data) => {
retryConfig.maxAttempts=5
: टास्क की सूची में शामिल हर टास्क को ज़्यादा से ज़्यादा पांच बार तक अपने-आप आज़माकर देखा जा सकता है. इससे, नेटवर्क से जुड़ी गड़बड़ियों या किसी बाहरी सेवा के काम न करने की वजह से, कुछ समय के लिए होने वाली गड़बड़ियों को कम करने में मदद मिलती है.retryConfig.minBackoffSeconds=60
: हर कोशिश के अलावा, हर टास्क को कम से कम 60 सेकंड के बाद फिर से आज़माया जाता है. इससे हर कोशिश के बीच का समय ज़्यादा हो जाता है, ताकि हम फिर से कोशिश करने के पांच मौकों को जल्दी खत्म न कर दें.rateLimits.maxConcurrentDispatch=6
: एक बार में ज़्यादा से ज़्यादा छह टास्क डिस्पैच किए जाते हैं. इससे, मौजूदा फ़ंक्शन के लिए अनुरोधों की प्रोसेस को एक जैसा बनाए रखने में मदद मिलती है. साथ ही, ऐक्टिव इंस्टेंस और कोल्ड स्टार्ट की संख्या को कम करने में भी मदद मिलती है.
टास्क सूची के फ़ंक्शन की जांच करें
ज़्यादातर मामलों में, टास्क सूची के फ़ंक्शन की जांच करने के लिए, Cloud Functions एमुलेटर सबसे अच्छा तरीका है. टास्क कतार के फ़ंक्शन को एमुलेट करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करने का तरीका जानने के लिए, Emulator Suite का दस्तावेज़ देखें.
इसके अलावा, टास्क की सूची वाले फ़ंक्शन, Firebase Local Emulator Suite में सामान्य एचटीटीपी फ़ंक्शन के तौर पर दिखाए जाते हैं. एमुलेट किए गए टास्क फ़ंक्शन की जांच करने के लिए, json डेटा पेलोड के साथ एचटीटीपी पोस्ट अनुरोध भेजें:
# start the Firebase Emulators
firebase emulators:start
# trigger the emulated task queue function
curl \
-X POST # An HTTP POST request...
-H "content-type: application/json" \ # ... with a JSON body
http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
-d '{"data": { ... some data .... }}' # ... with JSON encoded data
टास्क सूची के फ़ंक्शन डिप्लॉय करें
Firebase CLI का इस्तेमाल करके, टास्क कतार फ़ंक्शन को डिप्लॉय करना:
$ firebase deploy --only functions:backupApod
पहली बार टास्क कतार फ़ंक्शन को डिप्लॉय करते समय, सीएलआई आपके सोर्स कोड में बताए गए विकल्पों (दर को सीमित करना और फिर से कोशिश करना) के साथ, Cloud Tasks में टास्क कतार बनाता है.
अगर फ़ंक्शन को डिप्लॉय करते समय अनुमतियों से जुड़ी गड़बड़ियां होती हैं, तो पक्का करें कि डिप्लॉयमेंट के निर्देश चलाने वाले उपयोगकर्ता को सही आईएएम भूमिकाएं असाइन की गई हों.
टास्क की सूची में फ़ंक्शन जोड़ना
टास्क कतार फ़ंक्शन को Cloud Tasks में, Cloud Functions for Firebase जैसे भरोसेमंद सर्वर एनवायरमेंट से enqueue किया जा सकता है. इसके लिए, Node.js के लिए Firebase Admin SDK का इस्तेमाल किया जाता है. अगर आपने Admin SDK का इस्तेमाल पहले कभी नहीं किया है, तो इसे इस्तेमाल करने के लिए Firebase को सर्वर से जोड़ना लेख देखें.
सामान्य फ़्लो में, Admin SDK एक नया टास्क बनाता है, उसे Cloud Tasks में जोड़ता है, और टास्क के लिए कॉन्फ़िगरेशन सेट करता है:
exports.enqueueBackupTasks = functions.https.onRequest(
async (_request, response) => {
const queue = getFunctions().taskQueue("backupApod");
const enqueues = [];
for (let i = 0; i <= 10; i += 1) {
// Enqueue each task with i*60 seconds delay. Our task queue function
// should process ~1 task/min.
const scheduleDelaySeconds = i * 60
enqueues.push(
queue.enqueue(
{ id: `task-${i}` },
{
scheduleDelaySeconds,
dispatchDeadlineSeconds: 60 * 5 // 5 minutes
},
),
);
}
await Promise.all(enqueues);
response.sendStatus(200);
});
scheduleDelaySeconds
: सैंपल कोड, टास्क को एक साथ पूरा करने के बजाय, टास्क के हिसाब से अलग-अलग समय पर पूरा करने की कोशिश करता है. इसका मतलब है कि एक मिनट में एक टास्क ट्रिगर हो सकता है. ध्यान दें कि अगर आपको Cloud Tasks को किसी खास समय पर कोई टास्क ट्रिगर करना है, तोscheduleTime
का भी इस्तेमाल किया जा सकता है.dispatchDeadlineSeconds
: किसी टास्क को पूरा होने में लगने वाला ज़्यादा से ज़्यादा समय. Cloud Tasks, टास्क को फिर से शुरू करने के लिए, सूची के कॉन्फ़िगरेशन के हिसाब से या समयसीमा खत्म होने तक कोशिश करता रहेगा. सैंपल में, टास्क को पांच बार तक फिर से इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है. हालांकि, अगर पूरी प्रोसेस (फिर से कोशिश करने की कोशिशें भी शामिल है) में पांच मिनट से ज़्यादा समय लगता है, तो टास्क अपने-आप रद्द हो जाता है.
समस्या का हल
Cloud Tasks">Cloud Tasks लॉगिंग की सुविधा चालू करें
Cloud Tasks के लॉग में, गड़बड़ी की जानकारी होती है. जैसे, किसी टास्क से जुड़े अनुरोध की स्थिति. डिफ़ॉल्ट रूप से, Cloud Tasks के लॉग बंद रहते हैं. इसकी वजह यह है कि यह आपके प्रोजेक्ट पर बहुत ज़्यादा लॉग जनरेट कर सकता है. हमारा सुझाव है कि टास्क सूची के फ़ंक्शन को डेवलप और डीबग करते समय, डीबग लॉग चालू करें. लॉगिंग चालू करना देखें.
IAM अनुमतियां
टास्क को सूची में जोड़ते समय या Cloud Tasks के टास्क सूची के फ़ंक्शन को चालू करने की कोशिश करते समय, आपको PERMISSION DENIED
गड़बड़ियां दिख सकती हैं. पक्का करें कि आपके प्रोजेक्ट में ये IAM बाइंडिंग मौजूद हों:
Cloud Tasks में टास्क को लाइन में लगाने के लिए इस्तेमाल की गई पहचान के पास, Cloud Tasks IAM की अनुमति होनी चाहिए.
सैंपल में, यह App Engine का डिफ़ॉल्ट सेवा खाता है
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
Cloud Tasks में टास्क को सूची में जोड़ने के लिए इस्तेमाल की गई पहचान को, Cloud Tasks में किसी टास्क से जुड़े सेवा खाते का इस्तेमाल करने की अनुमति चाहिए.
सैंपल में, यह App Engine का डिफ़ॉल्ट सेवा खाता है.
App Engine डिफ़ॉल्ट सेवा खाते के उपयोगकर्ता के तौर पर, App Engine डिफ़ॉल्ट सेवा खाते को जोड़ने का तरीका जानने के लिए, Google Cloud IAM दस्तावेज़ देखें.
टास्क सूची के फ़ंक्शन को ट्रिगर करने के लिए इस्तेमाल की गई पहचान के पास,
cloudfunctions.functions.invoke
अनुमति होनी चाहिए.सैंपल में, यह App Engine का डिफ़ॉल्ट सेवा खाता है
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker