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

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

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

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

2nd gen के फ़ंक्शन के लिए, इस दौरान, फिर से कोशिश करने की समयसीमा 24 घंटे में खत्म हो जाती है. 1st gen के फ़ंक्शन के लिए यह फ़ंक्शन इस्तेमाल नहीं किया जा सकता सात दिन के बाद. 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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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