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

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

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

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

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

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

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

'फिर से कोशिश करें' फ़ंक्शन के बारे में जानकारी

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

  • Google Cloud console या Cloud Run Admin API के ज़रिए बनाए गए फ़ंक्शन के लिए, आपको इवेंट ट्रिगर को अलग से बनाना और मैनेज करना होगा. ट्रिगर में, फिर से कोशिश करने के डिफ़ॉल्ट तरीके होते हैं. इन्हें अपने फ़ंक्शन की ज़रूरतों के हिसाब से बदला जा सकता है.
  • Cloud Functions v2 API की मदद से बनाए गए फ़ंक्शन, ज़रूरी इवेंट ट्रिगर को अपने-आप बना देंगे. जैसे, Pub/Sub विषय या Eventarc ट्रिगर. डिफ़ॉल्ट रूप से, इन ट्रिगर के लिए फिर से कोशिश करने की सुविधा बंद रहती है. इसे Cloud Functions v2 API का इस्तेमाल करके फिर से चालू किया जा सकता है.

Cloud Run की मदद से बनाए गए इवेंट-ड्रिवन फ़ंक्शन

Google Cloud console या Cloud Run Admin API की मदद से बनाए गए फ़ंक्शन के लिए, आपको इवेंट ट्रिगर को अलग से बनाना और मैनेज करना होगा. हमारा सुझाव है कि आप हर तरह के ट्रिगर के डिफ़ॉल्ट व्यवहार की समीक्षा करें:

Cloud Functions v2 API की मदद से बनाए गए इवेंट-ड्रिवन फ़ंक्शन

Cloud Functions v2 API का इस्तेमाल करके बनाए गए फ़ंक्शन. उदाहरण के लिए, Cloud Functions gcloud CLI, REST API या Terraform का इस्तेमाल करने पर, आपकी ओर से इवेंट ट्रिगर बनाए जाएंगे और उन्हें मैनेज किया जाएगा. डिफ़ॉल्ट रूप से, अगर किसी फ़ंक्शन को कॉल करने पर गड़बड़ी का मैसेज मिलता है, तो फ़ंक्शन को फिर से कॉल नहीं किया जाता और इवेंट को ड्रॉप कर दिया जाता है. किसी इवेंट-ड्रिवन फ़ंक्शन पर फिर से कोशिश करने की सुविधा चालू करने पर, Cloud Functions उस फ़ंक्शन को तब तक फिर से आज़माता है, जब तक वह पूरी तरह से काम नहीं कर लेता या फिर से कोशिश करने की विंडो खत्म नहीं हो जाती.

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

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

कंसोल से, फिर से कोशिश करने की सुविधा कॉन्फ़िगर करना

नया फ़ंक्शन बनाते समय:

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

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

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

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

Cloud Functions for Firebase का इस्तेमाल करके, किसी फ़ंक्शन के लिए कोड में फिर से कोशिश करने की सुविधा चालू की जा सकती है. functions.foo.onBar(myHandler); जैसे बैकग्राउंड फ़ंक्शन के लिए ऐसा करने के लिए, runWith का इस्तेमाल करें और गड़बड़ी की नीति कॉन्फ़िगर करें:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

true को दिखाए गए तरीके से सेट करने पर, फ़ंक्शन को गड़बड़ी होने पर फिर से कोशिश करने के लिए कॉन्फ़िगर किया जाता है.

फिर से कोशिश करने की विंडो

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

सबसे सही तरीके

इस सेक्शन में, फिर से कोशिश करने के सबसे सही तरीकों के बारे में बताया गया है.

कुछ समय के लिए होने वाली गड़बड़ियों को ठीक करने के लिए, फिर से कोशिश करें

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

बार-बार कोशिश करने के लूप से बचने के लिए, खत्म होने की शर्त सेट करें

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

किसी तय समय से पहले के टाइमस्टैंप वाले इवेंट को हटाना, एक आसान और असरदार तरीका है. इससे, गड़बड़ियों के लगातार होने या उम्मीद से ज़्यादा समय तक होने पर, टास्क को बार-बार चलाने से बचा जा सकता है.

उदाहरण के लिए, यह कोड स्निपेट 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;
}

Promises के साथ catch का इस्तेमाल करना

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

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

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

इवेंट-ड्रिवन फ़ंक्शन को दोबारा कोशिश करने लायक बनाना

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

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

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

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

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

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

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

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