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

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

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

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

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

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

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

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

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

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