Check out what’s new from Firebase at Google I/O 2022. Learn more

सुझाव और युक्ति

यह दस्तावेज़ क्लाउड फ़ंक्शंस को डिज़ाइन करने, कार्यान्वित करने, परीक्षण करने और परिनियोजित करने के लिए सर्वोत्तम प्रथाओं का वर्णन करता है।

यथार्थता

यह खंड क्लाउड फ़ंक्शंस को डिज़ाइन और कार्यान्वित करने के लिए सामान्य सर्वोत्तम प्रथाओं का वर्णन करता है।

निष्क्रिय कार्य लिखें

आपके कार्यों को एक ही परिणाम देना चाहिए, भले ही उन्हें कई बार बुलाया जाए। यह आपको किसी आमंत्रण का पुन: प्रयास करने देता है यदि पिछला आमंत्रण आपके कोड के माध्यम से आंशिक रूप से विफल हो जाता है। अधिक जानकारी के लिए, पृष्ठभूमि फ़ंक्शन का पुन: प्रयास करना देखें।

पृष्ठभूमि गतिविधियाँ शुरू न करें

पृष्ठभूमि गतिविधि कुछ भी है जो आपके फ़ंक्शन के समाप्त होने के बाद होती है। फ़ंक्शन के वापस आने पर या अन्यथा संकेत पूर्ण होने पर, जैसे कि Node.js पृष्ठभूमि फ़ंक्शन में callback तर्क को कॉल करके, फ़ंक्शन आमंत्रण समाप्त हो जाता है। ग्रेसफुल टर्मिनेशन के बाद चलने वाला कोई भी कोड सीपीयू तक नहीं पहुंच सकता है और न ही कोई प्रगति करेगा।

इसके अलावा, जब उसी वातावरण में बाद के आह्वान को निष्पादित किया जाता है, तो आपकी पृष्ठभूमि गतिविधि फिर से शुरू हो जाती है, नए आह्वान में हस्तक्षेप करती है। इससे अनपेक्षित व्यवहार और त्रुटियां हो सकती हैं जिनका निदान करना कठिन है। किसी फ़ंक्शन के समाप्त होने के बाद नेटवर्क तक पहुँचने से आमतौर पर कनेक्शन रीसेट हो जाते हैं ( ECONNRESET त्रुटि कोड)।

पृष्ठभूमि गतिविधि को अक्सर अलग-अलग आमंत्रणों के लॉग में पता लगाया जा सकता है, कुछ भी ढूंढकर जो लाइन के बाद लॉग इन किया गया है कि आमंत्रण समाप्त हो गया है। पृष्ठभूमि गतिविधि को कभी-कभी कोड में गहराई से दफन किया जा सकता है, खासकर जब अतुल्यकालिक संचालन जैसे कि कॉलबैक या टाइमर मौजूद होते हैं। यह सुनिश्चित करने के लिए अपने कोड की समीक्षा करें कि फ़ंक्शन को समाप्त करने से पहले सभी एसिंक्रोनस ऑपरेशन समाप्त हो जाएं।

हमेशा अस्थायी फ़ाइलें हटाएं

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

आप किसी व्यक्तिगत फ़ंक्शन द्वारा उपयोग की गई मेमोरी को GCP कंसोल में फ़ंक्शन की सूची में चुनकर और मेमोरी उपयोग प्लॉट चुनकर देख सकते हैं।

अस्थायी निर्देशिका के बाहर लिखने का प्रयास न करें, और फ़ाइल पथ बनाने के लिए प्लेटफ़ॉर्म/ओएस-स्वतंत्र विधियों का उपयोग करना सुनिश्चित करें।

पाइपलाइनिंग का उपयोग करके बड़ी फ़ाइलों को संसाधित करते समय आप स्मृति आवश्यकताओं को कम कर सकते हैं। उदाहरण के लिए, आप क्लाउड स्टोरेज पर किसी फ़ाइल को रीड स्ट्रीम बनाकर, स्ट्रीम-आधारित प्रक्रिया के माध्यम से पास करके और आउटपुट स्ट्रीम को सीधे क्लाउड स्टोरेज पर लिखकर प्रोसेस कर सकते हैं।

उपकरण

यह खंड क्लाउड फ़ंक्शंस को लागू करने, परीक्षण करने और इंटरैक्ट करने के लिए टूल का उपयोग करने के तरीके के बारे में दिशानिर्देश प्रदान करता है।

स्थानीय विकास

फ़ंक्शन परिनियोजन में थोड़ा समय लगता है, इसलिए स्थानीय रूप से आपके फ़ंक्शन के कोड का परीक्षण करना अक्सर तेज़ होता है।

फायरबेस डेवलपर्स फायरबेस सीएलआई क्लाउड फंक्शंस एमुलेटर का उपयोग कर सकते हैं।

ईमेल भेजने के लिए Sendgrid का उपयोग करें

क्लाउड फ़ंक्शंस पोर्ट 25 पर आउटबाउंड कनेक्शन की अनुमति नहीं देता है, इसलिए आप SMTP सर्वर से गैर-सुरक्षित कनेक्शन नहीं बना सकते। ईमेल भेजने का अनुशंसित तरीका SendGrid का उपयोग करना है। आप Google कंप्यूट इंजन के इंस्टेंस ट्यूटोरियल से ईमेल भेजने में ईमेल भेजने के अन्य विकल्प पा सकते हैं।

प्रदर्शन

यह खंड प्रदर्शन को अनुकूलित करने के लिए सर्वोत्तम प्रथाओं का वर्णन करता है।

निर्भरता का बुद्धिमानी से उपयोग करें

क्योंकि फ़ंक्शन स्टेटलेस होते हैं, निष्पादन वातावरण को अक्सर खरोंच से शुरू किया जाता है (जिसे कोल्ड स्टार्ट के रूप में जाना जाता है)। जब कोई कोल्ड स्टार्ट होता है, तो फ़ंक्शन के वैश्विक संदर्भ का मूल्यांकन किया जाता है।

यदि आपके फ़ंक्शन मॉड्यूल आयात करते हैं, तो उन मॉड्यूल के लिए लोड समय कोल्ड स्टार्ट के दौरान आमंत्रण विलंबता में जोड़ सकता है। आप इस विलंबता को कम कर सकते हैं, साथ ही साथ अपने फ़ंक्शन को तैनात करने के लिए आवश्यक समय, निर्भरता को सही ढंग से लोड करके और उन निर्भरताओं को लोड नहीं करके जो आपके फ़ंक्शन का उपयोग नहीं करते हैं।

भविष्य के आह्वान में वस्तुओं का पुन: उपयोग करने के लिए वैश्विक चर का उपयोग करें

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

इस तरह आप उन वस्तुओं को कैश कर सकते हैं जो प्रत्येक फ़ंक्शन आमंत्रण पर फिर से बनाना महंगा हो सकता है। ऐसी वस्तुओं को फ़ंक्शन बॉडी से वैश्विक दायरे में ले जाने से महत्वपूर्ण प्रदर्शन में सुधार हो सकता है। निम्न उदाहरण प्रति फ़ंक्शन उदाहरण में केवल एक बार एक भारी वस्तु बनाता है, और इसे दिए गए उदाहरण तक पहुंचने वाले सभी फ़ंक्शन आमंत्रणों में साझा करता है:

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

वैश्विक दायरे में नेटवर्क कनेक्शन, लाइब्रेरी संदर्भ और एपीआई क्लाइंट ऑब्जेक्ट्स को कैश करना विशेष रूप से महत्वपूर्ण है। उदाहरण के लिए नेटवर्किंग का अनुकूलन देखें।

वैश्विक चर का आलसी आरंभीकरण करें

यदि आप वैश्विक दायरे में चर प्रारंभ करते हैं, तो प्रारंभिक कोड हमेशा ठंडे प्रारंभ आमंत्रण के माध्यम से निष्पादित किया जाएगा, जिससे आपके फ़ंक्शन की विलंबता बढ़ जाएगी। कुछ मामलों में, यह सेवाओं के लिए रुक-रुक कर समयबाह्य होने का कारण बनता है यदि उन्हें एक try / catch ब्लॉक में उचित रूप से नियंत्रित नहीं किया जाता है। यदि सभी कोड पथों में कुछ वस्तुओं का उपयोग नहीं किया जाता है, तो मांग पर उन्हें आलसी रूप से प्रारंभ करने पर विचार करें:

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});

यह विशेष रूप से महत्वपूर्ण है यदि आप एक फ़ाइल में कई फ़ंक्शन परिभाषित करते हैं, और विभिन्न फ़ंक्शन विभिन्न चर का उपयोग करते हैं। जब तक आप आलसी इनिशियलाइज़ेशन का उपयोग नहीं करते हैं, आप उन वेरिएबल्स पर संसाधनों को बर्बाद कर सकते हैं जो इनिशियलाइज़ किए गए हैं लेकिन कभी उपयोग नहीं किए गए हैं।

न्यूनतम संख्या में उदाहरण सेट करके ठंड की शुरुआत को कम करें

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

इन रनटाइम विकल्पों के बारे में अधिक जानकारी के लिए नियंत्रण स्केलिंग व्यवहार देखें।

अतिरिक्त संसाधन

"Google क्लाउड प्रदर्शन एटलस" वीडियो क्लाउड फ़ंक्शंस कोल्ड बूट टाइम में प्रदर्शन को अनुकूलित करने के बारे में अधिक जानकारी प्राप्त करें।