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


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

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

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

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

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

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

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

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

टास्क सूची फ़ंक्शन लिखना

टास्क सूची वाले फ़ंक्शन लिखना शुरू करने के लिए, 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: एक बार में ज़्यादा से ज़्यादा 6 टास्क भेजे जाते हैं. इससे यह पक्का करने में मदद मिलती है कि बुनियादी फ़ंक्शन के लिए अनुरोधों की संख्या लगातार बनी रहे. साथ ही, ऐक्टिव इंस्टेंस की संख्या और कोल्ड स्टार्ट की संख्या कम करने में मदद मिलती है.

टास्क सूची के फ़ंक्शन की जांच करना

Firebase लोकल एम्युलेटर सुइट में टास्क की सूची के फ़ंक्शन को आसान एचटीटीपी फ़ंक्शन के तौर पर दिखाया जाता है. 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 भूमिकाएं असाइन की गई हों.

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

'टास्क सूची' फ़ंक्शन किसी भरोसेमंद सर्वर एनवायरमेंट से Cloud Tasks में जोड़े जा सकते हैं. जैसे, 'Firebase के लिए Cloud Functions'. इसके लिए, Node.js के लिए 'Firebase एडमिन' SDK टूल का इस्तेमाल करें. अगर आपने एडमिन SDK टूल का इस्तेमाल पहले कभी नहीं किया है, तो Firebase को सर्वर से जोड़ना लेख पढ़ें.

सामान्य तरीके में, एडमिन 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वें मिनट की देरी जोड़कर, टास्क के लागू होने का समय बढ़ाने की कोशिश करता है. इससे ~1 टास्क/मिनट को ट्रिगर करना पड़ जाता है. ध्यान दें कि क्लाउड टास्क से किसी खास समय पर टास्क ट्रिगर करने के लिए, scheduleTime का भी इस्तेमाल किया जा सकता है.
  • dispatchDeadlineSeconds: किसी टास्क के पूरा होने में, 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