अतुल्यकालिक कार्यों का पुन: प्रयास करें

यह दस्तावेज़ बताता है कि विफलता पर पुनः प्रयास करने के लिए आप एसिंक्रोनस (गैर-HTTPS) पृष्ठभूमि फ़ंक्शन का अनुरोध कैसे कर सकते हैं।

पुनः प्रयास का शब्दार्थ

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

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

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

इवेंट-संचालित फ़ंक्शन पूर्ण होने में विफल क्यों होते हैं?

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

आमतौर पर, फ़ंक्शन कोड में उत्पन्न त्रुटियों के कारण एक इवेंट-संचालित फ़ंक्शन सफलतापूर्वक पूरा होने में विफल हो सकता है। ऐसा होने के कारणों में शामिल हैं:

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

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

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

GCP कंसोल से पुनः प्रयास कॉन्फ़िगर करें

यदि आप कोई नया फ़ंक्शन बना रहे हैं:

  1. फ़ंक्शन बनाएं स्क्रीन से, ट्रिगर जोड़ें का चयन करें और अपने फ़ंक्शन के लिए ट्रिगर के रूप में कार्य करने के लिए ईवेंट का प्रकार चुनें।
  2. इवेंटार्क ट्रिगर फलक में, पुनर्प्रयासों को सक्षम करने के लिए विफलता पर पुनः प्रयास करें चेकबॉक्स का चयन करें।

यदि आप कोई मौजूदा फ़ंक्शन अपडेट कर रहे हैं:

  1. क्लाउड फ़ंक्शंस अवलोकन पृष्ठ से, उस फ़ंक्शन के नाम पर क्लिक करें जिसे आप फ़ंक्शन विवरण स्क्रीन खोलने के लिए अपडेट कर रहे हैं, फिर HTTPS और इवेंटार्क ट्रिगर पैन प्रदर्शित करने के लिए मेनू बार से संपादित करें चुनें।
  2. इवेंटआर्क ट्रिगर फलक में, अपने ट्रिगर की सेटिंग्स को संपादित करने के लिए संपादन आइकन पर क्लिक करें।
  3. इवेंटार्क ट्रिगर फलक में, पुनर्प्रयासों को सक्षम या अक्षम करने के लिए विफलता पर पुनः प्रयास करें चेकबॉक्स का चयन करें या साफ़ करें।

अपने फ़ंक्शन कोड से पुनः प्रयास कॉन्फ़िगर करें

फायरबेस के लिए क्लाउड फ़ंक्शंस के साथ, आप किसी फ़ंक्शन के लिए कोड में पुनः प्रयास सक्षम कर सकते हैं। बैकग्राउंड फ़ंक्शन के लिए ऐसा करने के लिए जैसे 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);
});

पुनः प्रयास योग्य ईवेंट-संचालित फ़ंक्शंस को निष्क्रिय बनाएं

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

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

पुनः प्रयास नीति कॉन्फ़िगर करें

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

  • पुनः प्रयास विंडो को 7 दिनों से घटाकर कम से कम 10 मिनट कर दें।
  • घातीय बैकऑफ़ पुनः प्रयास रणनीति के लिए न्यूनतम और अधिकतम बैकऑफ़ समय बदलें।
  • तुरंत पुनः प्रयास करने के लिए पुनः प्रयास रणनीति बदलें।
  • एक मृत-अक्षर विषय कॉन्फ़िगर करें.
  • डिलीवरी प्रयासों की अधिकतम और न्यूनतम संख्या निर्धारित करें।

पुनः प्रयास नीति को कॉन्फ़िगर करने के लिए:

  1. एक HTTP फ़ंक्शन लिखें.
  2. लक्ष्य के रूप में फ़ंक्शन के URL को निर्दिष्ट करते हुए, पब/सब सदस्यता बनाने के लिए पब/सब एपीआई का उपयोग करें।

पब/सब को सीधे कॉन्फ़िगर करने के बारे में अधिक जानकारी के लिए विफलताओं से निपटने पर पब/सब दस्तावेज़ देखें।