एसिंक्रोनस फ़ंक्शन का फिर से इस्तेमाल करें

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

फिर से कोशिश करने के मतलब

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

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

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

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

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

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

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

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

पुनर्प्रयासों को सक्षम या अक्षम करें

कंसोल से दोबारा की जाने वाली कोशिशों को कॉन्फ़िगर करें

अगर कोई नया फ़ंक्शन बनाया जा रहा है, तो:

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

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

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

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

'Firebase के लिए Cloud Functions' की मदद से, किसी फ़ंक्शन के लिए कोड में फिर से कोशिश करने की सुविधा चालू की जा सकती है. 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;
}

प्रॉमिस के साथ catch का इस्तेमाल करें

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

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

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

फिर से इस्तेमाल किए जा सकने वाले इवेंट-ड्रिवन फ़ंक्शन को एक जैसा बनाएं

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

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

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

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

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

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

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

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