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

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

फिर से कोशिश करने के सिमैंटिक

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

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

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

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

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

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

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

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

फिर से कोशिश करने की सुविधा चालू या बंद करें

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

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

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

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

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

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

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

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

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

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

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

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

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