Cloud Tasks की मदद से, फ़ंक्शन को सूची में जोड़ें


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

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

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

Cloud Functions for Firebase v3.20.1 और इसके बाद के वर्शन के लिए Firebase SDK टूल, टास्क कतार की सुविधाओं के साथ काम करने के लिए, Firebase Admin SDK v10.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 सीएलआई का इस्तेमाल करके टास्क सूची फ़ंक्शन डिप्लॉय करें:

$ firebase deploy --only functions:backupApod

पहली बार टास्क कतार फ़ंक्शन को डिप्लॉय करते समय, सीएलआई आपके सोर्स कोड में बताए गए विकल्पों (दर को सीमित करना और फिर से कोशिश करना) के साथ, Cloud Tasks में टास्क कतार बनाता है.

अगर फ़ंक्शन डिप्लॉय करते समय आपको अनुमतियों से जुड़ी गड़बड़ियां मिलती हैं, तो पक्का करें कि डिप्लॉयमेंट निर्देश चलाने वाले उपयोगकर्ता को सही IAM भूमिकाएं असाइन की गई हों.

टास्क की सूची में फ़ंक्शन जोड़ना

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