Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

क्लाउड टास्क के साथ कतारबद्ध कार्य

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

टास्क कतार फ़ंक्शन Google क्लाउड टास्क का लाभ उठाते हैं ताकि आपके ऐप को समय लेने वाली, संसाधन-गहन, या बैंडविड्थ-सीमित कार्यों को अतुल्यकालिक रूप से चलाने में मदद मिल सके, आपके मुख्य एप्लिकेशन प्रवाह के बाहर।

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

इस जटिलता को कम करने के लिए, आप एक टास्क क्यू फ़ंक्शन लिख सकते हैं जो scheduleTime और dispatchDeadline जैसे बुनियादी कार्य विकल्पों को सेट करता है, और फिर क्लाउड टास्क में फ़ंक्शन को कतार में बंद कर देता है। क्लाउड टास्क पर्यावरण विशेष रूप से इस प्रकार के संचालन के लिए प्रभावी भीड़ नियंत्रण और पुनः प्रयास नीतियों को सुनिश्चित करने के लिए डिज़ाइन किया गया है।

Firebase v3.20.1 के लिए क्लाउड फ़ंक्शंस के लिए Firebase SDK और टास्क कतार कार्यों का समर्थन करने के लिए Firebase Admin SDK v10.2.0 और उच्चतर के साथ इंटरऑपरेट करता है।

Firebase के साथ टास्क क्यू फ़ंक्शंस का उपयोग करने से क्लाउड टास्क प्रोसेसिंग के लिए शुल्क लग सकता है। अधिक जानकारी के लिए क्लाउड कार्य मूल्य देखें।

कार्य कतार कार्यों का निर्माण

कार्य कतार कार्यों का उपयोग करने के लिए, इस कार्यप्रवाह का पालन करें:

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

लेखन कार्य कतार कार्य करता है

टास्क क्यू फ़ंक्शंस लिखना शुरू करने के लिए onTaskDispatched का उपयोग करें। कार्य कतार फ़ंक्शन लिखने का एक महत्वपूर्ण हिस्सा प्रति-कतार पुनर्प्रयास और दर-सीमित कॉन्फ़िगरेशन सेट करना है। इस पृष्ठ के कोड नमूने एक ऐप पर आधारित हैं जो एक ऐसी सेवा स्थापित करता है जो नासा के एस्ट्रोनॉमी पिक्चर ऑफ द डे से सभी छवियों का बैकअप लेती है:

कार्य कतार विन्यास

कार्य कतार फ़ंक्शन कॉन्फ़िगरेशन सेटिंग्स के एक शक्तिशाली सेट के साथ आते हैं ताकि दर सीमा को ठीक से नियंत्रित किया जा सके और कार्य कतार के व्यवहार को पुनः प्रयास किया जा सके:

exports.backupapod = onTaskDispatched(
    {
      retryConfig: {
        maxAttempts: 5,
        minBackoffSeconds: 60,
      },
      rateLimits: {
        maxConcurrentDispatches: 6,
      },
    }, async (req) => {
  • retryConfig.maxAttempts=5 : कार्य कतार में प्रत्येक कार्य स्वचालित रूप से 5 बार तक पुनः प्रयास किया जाता है। यह क्षणिक त्रुटियों को कम करने में मदद करता है जैसे कि नेटवर्क त्रुटियाँ या किसी आश्रित, बाहरी सेवा के अस्थायी सेवा व्यवधान।
  • retryConfig.minBackoffSeconds=60 : प्रत्येक कार्य को प्रत्येक प्रयास के अलावा कम से कम 60 सेकंड के लिए पुनः प्रयास किया जाता है। यह प्रत्येक प्रयास के बीच एक बड़ा बफर प्रदान करता है इसलिए हम 5 पुन: प्रयास को बहुत जल्दी समाप्त करने की जल्दी नहीं करते हैं।
  • rateLimits.maxConcurrentDispatch=6 : एक निश्चित समय पर अधिकतम 6 कार्य भेजे जाते हैं। यह अंतर्निहित कार्य के लिए अनुरोधों की एक स्थिर धारा सुनिश्चित करने में मदद करता है और सक्रिय उदाहरणों की संख्या और ठंड की शुरुआत को कम करने में मदद करता है।

फायरबेस लोकल एम्यूलेटर सुइट का उपयोग करके टास्क कतार के कार्यों का परीक्षण करना

फायरबेस लोकल इम्यूलेटर सूट में टास्क क्यू फ़ंक्शंस सरल HTTP फ़ंक्शंस के रूप में सामने आते हैं। आप json डेटा पेलोड के साथ HTTP POST अनुरोध भेजकर अनुकरणीय कार्य फ़ंक्शन का परीक्षण कर सकते हैं:

 # start the Local Emulator Suite
 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

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

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

फ़ंक्शन को कतारबद्ध करें

टास्क कतार कार्यों को नोड.जेएस के लिए फायरबेस एडमिन एसडीके का उपयोग करके फायरबेस के लिए क्लाउड फ़ंक्शंस जैसे विश्वसनीय सर्वर वातावरण से क्लाउड टास्क में कतारबद्ध किया जा सकता है। यदि आप व्यवस्थापक SDK में नए हैं, तो आरंभ करने के लिए सर्वर में Firebase जोड़ें देखें।

एक विशिष्ट प्रवाह में, व्यवस्थापक SDK एक नया कार्य बनाता है, इसे क्लाउड कार्य में संलग्न करता है, और कार्य के लिए कॉन्फ़िगरेशन सेट करता है:

exports.enqueuebackuptasks = onRequest(
    async (_request, response) => {
      const queue = getFunctions().taskQueue("backupapod");
      const targetUri = await getFunctionUrl("backupapod");

      const enqueues = [];
      for (let i = 0; i <= BACKUP_COUNT; i += 1) {
        const iteration = Math.floor(i / HOURLY_BATCH_SIZE);
        // Delay each batch by N * hour
        const scheduleDelaySeconds = iteration * (60 * 60);

        const backupDate = new Date(BACKUP_START_DATE);
        backupDate.setDate(BACKUP_START_DATE.getDate() + i);
        // Extract just the date portion (YYYY-MM-DD) as string.
        const date = backupDate.toISOString().substring(0, 10);
        enqueues.push(
            queue.enqueue({date}, {
              scheduleDelaySeconds,
              dispatchDeadlineSeconds: 60 * 5, // 5 minutes
              uri: targetUri,
            }),
        );
      }
      await Promise.all(enqueues);
      response.sendStatus(200);
    });
  • scheduleDelaySeconds : नमूना कोड Nth कार्य के लिए Nth मिनट की देरी को जोड़कर कार्यों के निष्पादन को फैलाने का प्रयास करता है। यह ~ 1 कार्य/मिनट ट्रिगर करने के लिए अनुवाद करता है। ध्यान दें कि यदि आप चाहते हैं कि क्लाउड टास्क किसी विशिष्ट समय पर कार्य को ट्रिगर करे तो आप शेड्यूलटाइम का भी उपयोग scheduleTime सकते हैं।
  • dispatchDeadlineSeconds : अधिकतम समय क्लाउड टास्क किसी कार्य के पूरा होने की प्रतीक्षा करेगा। क्लाउड कार्य कतार के पुनर्प्रयास कॉन्फ़िगरेशन के बाद या इस समय सीमा तक पहुंचने तक कार्य को फिर से करने का प्रयास करेगा। नमूने में, कतार को 5 बार तक कार्य को पुनः प्रयास करने के लिए कॉन्फ़िगर किया गया है, लेकिन यदि पूरी प्रक्रिया (पुनर्प्रयास सहित) में 5 मिनट से अधिक समय लगता है, तो कार्य स्वचालित रूप से रद्द हो जाता है।

लक्ष्य यूआरआई प्राप्त करें और शामिल करें

चूंकि फायरबेस के लिए क्लाउड फ़ंक्शंस (द्वितीय जीन) नियतात्मक HTTP URL का समर्थन नहीं करता है, इसलिए आपको प्रत्येक कतारबद्ध कार्य में मैन्युअल रूप से लक्ष्य URI को पुनः प्राप्त करना और शामिल करना होगा। जैसा कि नीचे दिखाया गया है, आप अपने फ़ंक्शन के लिए प्रोग्रामेटिक रूप से URL भी प्राप्त कर सकते हैं:

/**
 * Get the URL of a given v2 cloud function.
 *
 * @param {string} name the function's name
 * @param {string} location the function's location
 * @return {Promise<string>} The URL of the function
 */
async function getFunctionUrl(name, location="us-central1") {
  if (!auth) {
    auth = new GoogleAuth({
      scopes: "https://www.googleapis.com/auth/cloud-platform",
    });
  }
  const projectId = await auth.getProjectId();
  const url = "https://cloudfunctions.googleapis.com/v2beta/" +
    `projects/${projectId}/locations/${location}/functions/${name}`;

  const client = await auth.getClient();
  const res = await client.request({url});
  const uri = res.data?.serviceConfig?.uri;
  if (!uri) {
    throw new Error(`Unable to retreive uri for function at ${url}`);
  }
  return uri;
}

समस्या निवारण

क्लाउड टास्क लॉगिंग चालू करें

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

आईएएम अनुमतियां

कार्यों को कतारबद्ध करते समय या जब क्लाउड कार्य आपके कार्य कतार कार्यों को शुरू करने का प्रयास करते हैं, तो आपको PERMISSION DENIED त्रुटियाँ दिखाई दे सकती हैं। सुनिश्चित करें कि आपके प्रोजेक्ट में निम्नलिखित IAM बाइंडिंग हैं:

  • कार्यों को क्लाउड कार्यों में कतारबद्ध करने के लिए उपयोग की जाने वाली पहचान के लिए cloudtasks.tasks.create IAM अनुमति की आवश्यकता होती है।

    नमूने में, यह ऐप इंजन डिफ़ॉल्ट सेवा खाता है

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudtasks.enqueuer
  • क्लाउड टास्क में कार्यों को कतारबद्ध करने के लिए उपयोग की जाने वाली पहचान को क्लाउड टास्क में किसी कार्य से जुड़े सेवा खाते का उपयोग करने की अनुमति की आवश्यकता होती है।

    नमूने में, यह ऐप इंजन डिफ़ॉल्ट सेवा खाता है

ऐप इंजन डिफ़ॉल्ट सेवा खाते को ऐप इंजन डिफ़ॉल्ट सेवा खाते के उपयोगकर्ता के रूप में कैसे जोड़ा जाए, इस पर निर्देशों के लिए Google क्लाउड IAM दस्तावेज़ देखें।

  • कार्य क्यू फ़ंक्शन को ट्रिगर करने के लिए उपयोग की जाने वाली पहचान के लिए cloudfunctions.functions.invoke अनुमति की आवश्यकता होती है।

    नमूने में, यह ऐप इंजन डिफ़ॉल्ट सेवा खाता है

gcloud functions add-iam-policy-binding $FUNCTION_NAME \
  --region=us-central1 \
  --member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
  --role=roles/cloudfunctions.invoker