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

टास्क की कतार वाले फ़ंक्शन लिखना

टास्क क्यू फ़ंक्शन लिखना शुरू करने के लिए, onDispatch का इस्तेमाल करें. टास्क क्यू फ़ंक्शन लिखने का एक अहम हिस्सा, हर क्यू के लिए फिर से कोशिश करने और दर को सीमित करने का कॉन्फ़िगरेशन सेट करना है. इस पेज पर दिए गए कोड के सैंपल, ऐसे ऐप्लिकेशन पर आधारित हैं जो नासा की Astronomy Picture of the Day से सभी इमेज का बैक अप लेने वाली सेवा सेट अप करता है:

टास्क क्यू फ़ंक्शन कॉन्फ़िगर करना

टास्क की सूची वाले फ़ंक्शन में, कॉन्फ़िगरेशन की सेटिंग का एक बेहतरीन सेट होता है. इससे टास्क की सूची की दर की सीमाओं और फिर से कोशिश करने के तरीके को सटीक तरीके से कंट्रोल किया जा सकता है:

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 डेटा पेलोड के साथ एचटीटीपी POST अनुरोध भेजकर, टास्क फ़ंक्शन का टेस्ट किया जा सकता है:

 # 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 में एक टास्क क्यू बनाता है. इसमें आपके सोर्स कोड में बताए गए विकल्प (रेट लिमिट और फिर से कोशिश करना) शामिल होते हैं.

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

टास्क कतार के फ़ंक्शन को कतार में लगाना

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

समस्या का हल

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

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

IAM अनुमतियां

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

  • 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