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

Cloud Functions

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

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

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

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

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

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

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

समस्या का हल

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

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

IAM अनुमतियां

टास्क को लाइन में लगाते समय या Cloud Tasks के टास्क कतार फ़ंक्शन को चालू करने की कोशिश करते समय, आपको PERMISSION DENIED गड़बड़ियां दिख सकती हैं. पक्का करें कि आपके प्रोजेक्ट में ये 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