एसिंक्रोनस फ़ंक्शन को फिर से आज़माएं

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

'फिर से कोशिश करें' फ़ंक्शन के बारे में जानकारी

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

दूसरे जनरेशन के फ़ंक्शन के लिए, फिर से कोशिश करने की यह विंडो 24 घंटे बाद खत्म हो जाती है. पहले जनरेशन के फ़ंक्शन के लिए, यह लिंक सात दिन के बाद काम नहीं करेगा. Cloud Functions, एक्सपोनेंशियल बैकऑफ़ की रणनीति का इस्तेमाल करके, नए बनाए गए इवेंट-ड्रिवन फ़ंक्शन को फिर से आज़माता है. इसमें बैकऑफ़ की अवधि 10 से 600 सेकंड के बीच बढ़ती है. यह नीति, नए फ़ंक्शन को पहली बार डिप्लॉय करने पर लागू होती है. यह उन मौजूदा फ़ंक्शन पर लागू नहीं होता जिन्हें इस रिलीज़ नोट में बताए गए बदलावों के लागू होने से पहले डिप्लॉय किया गया था. भले ही, आपने फ़ंक्शन को फिर से डिप्लॉय किया हो.

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

इवेंट-ड्रिवन फ़ंक्शन पूरा न होने की वजह

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

आम तौर पर, फ़ंक्शन कोड में होने वाली गड़बड़ियों की वजह से, इवेंट-ड्रिवन फ़ंक्शन पूरा नहीं हो पाता. ऐसा इन वजहों से हो सकता है:

  • फ़ंक्शन में कोई गड़बड़ी है और रनटाइम में कोई अपवाद दिखता है.
  • फ़ंक्शन, सेवा के एंडपॉइंट तक नहीं पहुंच सकता या ऐसा करने की कोशिश करते समय टाइम आउट हो जाता है.
  • फ़ंक्शन जान-बूझकर कोई अपवाद दिखाता है. उदाहरण के लिए, जब कोई पैरामीटर पुष्टि करने में विफल होता है.
  • Node.js फ़ंक्शन, अस्वीकार किया गया प्रॉमिस लौटाता है या कॉलबैक को गैर-null वैल्यू पास करता है.

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

फिर से कोशिश करने की सुविधा को चालू या बंद करना

कंसोल से, फिर से कोशिश करने की सुविधा कॉन्फ़िगर करना

नया फ़ंक्शन बनाते समय:

  1. फ़ंक्शन बनाएं स्क्रीन पर, ट्रिगर में जाकर, अपने फ़ंक्शन के लिए ट्रिगर के तौर पर काम करने वाला इवेंट टाइप चुनें.
  2. फिर से कोशिश करने की सुविधा चालू करने के लिए, अगर काम न हो पाए, तो फिर से कोशिश करें चेकबॉक्स को चुनें.

अगर आपको किसी मौजूदा फ़ंक्शन को अपडेट करना है, तो:

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

अपने फ़ंक्शन कोड से, फिर से कोशिश करने की सुविधा कॉन्फ़िगर करना

Cloud Functions for Firebase की मदद से, किसी फ़ंक्शन के लिए कोड में फिर से कोशिश करने की सुविधा चालू की जा सकती है. functions.foo.onBar(myHandler); जैसे बैकग्राउंड फ़ंक्शन के लिए ऐसा करने के लिए, runWith का इस्तेमाल करें और गड़बड़ी की नीति कॉन्फ़िगर करें:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

true को दिखाए गए तरीके से सेट करने पर, फ़ंक्शन को गड़बड़ी होने पर फिर से कोशिश करने के लिए कॉन्फ़िगर किया जाता है.

सबसे सही तरीके

इस सेक्शन में, बार-बार कोशिश करने के सबसे सही तरीके बताए गए हैं.

कुछ समय के लिए होने वाली गड़बड़ियों को ठीक करने के लिए, 'फिर से कोशिश करें' सुविधा का इस्तेमाल करें

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

बार-बार कोशिश करने के लूप से बचने के लिए, खत्म होने की शर्त सेट करें

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

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

उदाहरण के लिए, यह कोड स्निपेट 10 सेकंड से पुराने सभी इवेंट को खारिज कर देता है:

const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
  console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
  callback();
  return;
}

Promises के साथ catch का इस्तेमाल करना

अगर आपके फ़ंक्शन ने फिर से कोशिश की है, तो हैंडल नहीं की गई कोई भी गड़बड़ी फिर से कोशिश करेगी. पक्का करें कि आपका कोड ऐसी गड़बड़ियों को कैप्चर करे जिनकी वजह से फिर से कोशिश करने की ज़रूरत न पड़े.

यहां एक उदाहरण दिया गया है कि आपको क्या करना चाहिए:

return doFooAsync().catch((err) => {
    if (isFatal(err)) {
        console.error(`Fatal error ${err}`);
    }
    return Promise.reject(err);
});

इवेंट-ड्रिवन फ़ंक्शन को दोबारा कोशिश करने लायक बनाना

इवेंट-ड्रिवन फ़ंक्शन, दोबारा आज़माए जा सकते हैं. हालांकि, इसके लिए ज़रूरी है कि वे आइडेंटिटेम हों. इस तरह के फ़ंक्शन को आइडेंटिटेम होने के लिए, यहां कुछ सामान्य दिशा-निर्देश दिए गए हैं:

  • कई बाहरी एपीआई (जैसे, Stripe) आपको पैरामीटर के तौर पर, एक जैसी जानकारी देने वाली कुंजी देने की सुविधा देते हैं. अगर किसी ऐसे एपीआई का इस्तेमाल किया जा रहा है, तो आपको इवेंट आईडी का इस्तेमाल, डुप्लीकेट डेटा को रोकने के लिए बनी कुंजी के तौर पर करना चाहिए.
  • एक बार डिलीवरी करने की सुविधा के साथ, एक ही काम दोबारा करने की सुविधा अच्छी तरह से काम करती है. ऐसा इसलिए, क्योंकि इससे फिर से कोशिश करने में कोई खतरा नहीं होता. इसलिए, भरोसेमंद कोड लिखने के लिए सबसे सही तरीका यह है कि आप दोबारा कोशिश करने की सुविधा के साथ, एक ही काम दो बार न होने की सुविधा को जोड़ें.
  • पक्का करें कि आपका कोड, इंटरनल तौर पर आइडेंटिकल हो. उदाहरण के लिए:
    • पक्का करें कि नतीजे में बदलाव किए बिना, एक से ज़्यादा बार म्यूटेशन हो सकते हैं.
    • स्टेटस में बदलाव करने से पहले, किसी लेन-देन में डेटाबेस की स्थिति के बारे में क्वेरी करें.
    • पक्का करें कि सभी साइड इफ़ेक्ट, खुद ही आइडेंटिकेट करने वाले हों.
  • कोड से अलग, फ़ंक्शन के बाहर लेन-देन की जांच लागू करें. उदाहरण के लिए, किसी इवेंट आईडी को पहले से प्रोसेस किया जा चुका है, इस जानकारी को रिकॉर्ड करने के लिए, किसी जगह पर स्टेटस को सेव करें.
  • डुप्लीकेट फ़ंक्शन कॉल से आउट-ऑफ़-बैंड की समस्या हल करें. उदाहरण के लिए, क्लीन अप करने की एक अलग प्रोसेस रखें, जो डुप्लीकेट फ़ंक्शन कॉल के बाद हट जाए.

फिर से कोशिश करने की नीति कॉन्फ़िगर करना

अपने फ़ंक्शन की ज़रूरतों के आधार पर, हो सकता है कि आप फिर से कोशिश करने की नीति को सीधे तौर पर कॉन्फ़िगर करना चाहें. इससे, इनमें से किसी भी कॉम्बिनेशन को सेट अप किया जा सकता है:

  • फिर से कोशिश करने की समयसीमा को 7 दिन से कम करके, 10 मिनट कर दिया गया है.
  • एक्स्पोनेंशियल बैकऑफ़ फिर से कोशिश करने की रणनीति के लिए, कम से कम और ज़्यादा से ज़्यादा बैकऑफ़ समय बदलें.
  • तुरंत फिर से कोशिश करने के लिए, फिर से कोशिश करने की रणनीति बदलें.
  • डेड-लेटर विषय कॉन्फ़िगर करें.
  • डिलीवरी की कोशिशों की ज़्यादा से ज़्यादा और कम से कम संख्या सेट करें.

फिर से कोशिश करने की नीति कॉन्फ़िगर करने के लिए:

  1. एचटीटीपी फ़ंक्शन लिखें.
  2. Pub/Sub सदस्यता बनाने के लिए, Pub/Sub एपीआई का इस्तेमाल करें. साथ ही, फ़ंक्शन के यूआरएल को टारगेट के तौर पर बताएं.

Pub/Sub को सीधे कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, Pub/Sub से जुड़ी गड़बड़ियों को ठीक करने के बारे में दस्तावेज़ देखें.