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

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

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

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 से जुड़ी गड़बड़ियों को ठीक करने के बारे में दस्तावेज़ देखें.