Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

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

अधिक सामान्य रूप से, ईवेंट-चालित फ़ंक्शन फ़ंक्शन कोड में ही त्रुटियों के कारण सफलतापूर्वक पूर्ण होने में विफल हो सकता है। ऐसा होने के कुछ कारण इस प्रकार हैं:

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

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

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

GCP कंसोल का उपयोग करना

आप निम्न प्रकार से GCP कंसोल में पुन: प्रयास को सक्षम या अक्षम कर सकते हैं:

  1. पर जाएं बादल कार्य अवलोकन पृष्ठ मेघ प्लेटफ़ॉर्म कंसोल में।

  2. समारोह बनाएँ क्लिक करें। वैकल्पिक रूप से, अपने विवरण पृष्ठ पर जाएं और संपादन पर क्लिक करने के लिए एक मौजूदा समारोह पर क्लिक करें।

  3. अपने फ़ंक्शन के लिए आवश्यक फ़ील्ड भरें।

  4. सुनिश्चित करें उत्प्रेरक क्षेत्र में इस तरह के बादल Pub / Sub या क्लाउड संग्रहण के रूप में, एक घटना के आधार पर ट्रिगर प्रकार को तैयार है।

  5. अधिक क्लिक करके उन्नत सेटिंग्स का विस्तार करें।

  6. बॉक्स को चेक या विफलता पर पुन: प्रयास करें लेबल अनचेक करें।

फ़ंक्शन कोड में

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

पुन: प्रयास करने योग्य घटना-संचालित कार्यों को निष्क्रिय बनाएं

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

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