Cloud Tasks (पहली जनरेशन) की मदद से फ़ंक्शन को लाइन में लगाना

टास्क सूची के फ़ंक्शन, Google Cloud Tasks का फ़ायदा लेते हैं. इससे आपके ऐप्लिकेशन को ज़्यादा समय लेने वाले, ज़्यादा संसाधनों का इस्तेमाल करने वाले या सीमित बैंडविड्थ वाले टास्क को एसिंक्रोनस तरीके से चलाने में मदद मिलती है. ये टास्क, आपके मुख्य ऐप्लिकेशन फ़्लो से बाहर होते हैं.

उदाहरण के लिए, मान लें कि आपको इमेज फ़ाइलों के एक बड़े सेट का बैकअप बनाना है. ये फ़ाइलें, फ़िलहाल किसी ऐसे एपीआई पर होस्ट की गई हैं जिसमें अनुरोध संख्या सीमित करने की सुविधा है. एपीआई का ज़िम्मेदारी से इस्तेमाल करने के लिए, आपको अनुरोध संख्या सीमित करने की सुविधा का पालन करना होगा. इसके अलावा, लंबे समय तक चलने वाले इस तरह के जॉब, टाइम आउट और मेमोरी की सीमाओं की वजह से फ़ेल हो सकते हैं.

इस जटिलता को कम करने के लिए, टास्क सूची वाला ऐसा फ़ंक्शन लिखा जा सकता है जो scheduleTime और dispatchDeadline जैसे बुनियादी टास्क के विकल्प सेट करता है. इसके बाद, फ़ंक्शन को Cloud Tasks में मौजूद सूची को सौंप देता है. Cloud Tasks एनवायरमेंट को खास तौर पर इस तरह से डिज़ाइन किया गया है कि इस तरह के ऑपरेशन के लिए, कंजेशन कंट्रोल और फिर से कोशिश करने की नीतियां असरदार तरीके से काम कर सकें.

Cloud Functions for Firebase के लिए Firebase SDK टूल का वर्शन 3.20.1 और इसके बाद के वर्शन, Firebase Admin SDK के वर्शन 10.2.0 और इसके बाद के वर्शन के साथ काम करते हैं. इससे टास्क सूची के फ़ंक्शन इस्तेमाल किए जा सकते हैं.

Firebase के साथ टास्क सूची वाले फ़ंक्शन इस्तेमाल करने पर, Cloud Tasks प्रोसेसिंग के लिए शुल्क लिया जा सकता है. ज़्यादा जानकारी के लिए, Cloud Tasks की कीमत देखें.

टास्क सूची वाले फ़ंक्शन बनाना

टास्क सूची के फ़ंक्शन इस्तेमाल करने के लिए, यह वर्कफ़्लो अपनाएं:

  1. Cloud Functions के लिए Firebase SDK टूल का इस्तेमाल करके, टास्क सूची फ़ंक्शन लिखें.
  2. एचटीटीपी अनुरोध से ट्रिगर करके, अपने फ़ंक्शन की जांच करें.
  3. Firebase सीएलआई का इस्तेमाल करके, अपना फ़ंक्शन डिप्लॉय करें. टास्क सूची फ़ंक्शन को पहली बार डिप्लॉय करने पर, सीएलआई Cloud Tasks में एक टास्क सूची बनाएगा. इसमें आपके सोर्स कोड में बताए गए विकल्प (अनुरोध संख्या सीमित करना और फिर से कोशिश करना) शामिल होंगे.
  4. नई टास्क सूची में टास्क जोड़ें. साथ ही, ज़रूरत पड़ने पर टास्क को पूरा करने का शेड्यूल सेट अप करने के लिए पैरामीटर पास करें. इसके लिए, 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 में सूची में जोड़े जा सकते हैं. इसके लिए, Node.js के लिए Firebase Admin SDK का इस्तेमाल करके, Cloud Functions for Firebase जैसे भरोसेमंद सर्वर एनवायरमेंट का इस्तेमाल किया जा सकता है. अगर आपने 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: सैंपल कोड, टास्क को पूरा करने के लिए समय को बांटने की कोशिश करता है. इसके लिए, वह Nवें टास्क के लिए N मिनट की देरी को जोड़ता है. इसका मतलब है कि हर मिनट में एक टास्क ट्रिगर होता है. ध्यान दें कि अगर आपको Cloud Tasks से किसी ख़ास समय पर कोई टास्क ट्रिगर कराना है, तो scheduleTime का भी इस्तेमाल किया जा सकता है.
  • dispatchDeadlineSeconds: किसी टास्क को पूरा करने के लिए, Cloud Tasks ज़्यादा से ज़्यादा इतने समय तक इंतज़ार करेगा. Cloud Tasks, टास्क को फिर से पूरा करने की कोशिश करेगा. ऐसा, सूची के फिर से कोशिश करने के कॉन्फ़िगरेशन के मुताबिक या इस समयसीमा के खत्म होने तक किया जाएगा. सैंपल में, सूची को टास्क को फिर से शुरू करने के लिए पांच बार कॉन्फ़िगर किया गया है. हालांकि, अगर पूरी प्रोसेस (फिर से कोशिश करने के साथ) में पांच मिनट से ज़्यादा समय लगता है, तो टास्क अपने-आप रद्द हो जाता है.

समस्या का हल

Cloud Tasks लॉगिंग की सुविधा चालू करना

Cloud Tasks के लॉग में, गड़बड़ी की जानकारी देने वाली काम की जानकारी होती है. जैसे, किसी टास्क से जुड़े अनुरोध की स्थिति. डिफ़ॉल्ट रूप से, Cloud Tasks से मिलने वाले लॉग बंद होते हैं. ऐसा इसलिए होता है, क्योंकि यह आपके प्रोजेक्ट पर बड़ी संख्या में लॉग जनरेट कर सकता है. हमारा सुझाव है कि टास्क सूची के फ़ंक्शन को डेवलप और डीबग करते समय, डीबग लॉग चालू करें. लॉगिंग की सुविधा चालू करना लेख पढ़ें.

IAM से जुड़ी अनुमतियां

टास्क को सूची में शामिल करते समय या Cloud Tasks के आपके टास्क सूची फ़ंक्शन को शुरू करने की कोशिश करते समय, आपको PERMISSION DENIED गड़बड़ियां दिख सकती हैं. पक्का करें कि आपके प्रोजेक्ट में ये आईएएम बाइंडिंग हों:

  • Cloud Tasks में टास्क को सूची में जोड़ने के लिए इस्तेमाल की जाने वाली आइडेंटिटी के पास, cloudtasks.tasks.create 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