Catch up on highlights from Firebase at Google I/O 2023. Learn more

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

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

यथार्थता

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

उदासीन कार्यों को लिखें

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

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

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

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

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

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

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

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

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

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

औजार

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

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

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

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

ईमेल भेजने के लिए सेंडग्रिड का प्रयोग करें

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

प्रदर्शन

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

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

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

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

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

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

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

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 क्लाउड प्रदर्शन एटलस" वीडियो क्लाउड फ़ंक्शंस कोल्ड बूट टाइम में प्रदर्शन को अनुकूलित करने के बारे में और जानें।