युक्तियाँ एवं amp; चाल

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

यथार्थता

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

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

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

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

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

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

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

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

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

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

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

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

फ़ंक्शंस फ़्रेमवर्क

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

ऐसा करने के लिए, प्रासंगिक लॉक फ़ाइल में अपना पसंदीदा संस्करण शामिल करें (उदाहरण के लिए, Node.js के लिए package-lock.json , या Python के लिए requirements.txt )।

औजार

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

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

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

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

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

क्लाउड फ़ंक्शंस पोर्ट 25 पर आउटबाउंड कनेक्शन की अनुमति नहीं देता है, इसलिए आप एसएमटीपी सर्वर से गैर-सुरक्षित कनेक्शन नहीं बना सकते हैं। ईमेल भेजने का अनुशंसित तरीका सेंडग्रिड का उपयोग करना है। आप 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}`);
});

अजगर

import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

यह HTTP फ़ंक्शन एक अनुरोध ऑब्जेक्ट ( flask.Request ) लेता है, और प्रतिक्रिया पाठ, या मानों का कोई भी सेट लौटाता है जिसे make_response उपयोग करके Response ऑब्जेक्ट में बदला जा सकता है।

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

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

यदि आप वैश्विक दायरे में वेरिएबल आरंभ करते हैं, तो आरंभीकरण कोड हमेशा कोल्ड स्टार्ट इनवोकेशन के माध्यम से निष्पादित किया जाएगा, जिससे आपके फ़ंक्शन की विलंबता बढ़ जाएगी। कुछ मामलों में, यदि 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');
});

अजगर

from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

यह HTTP फ़ंक्शन आलसी-प्रारंभिक ग्लोबल्स का उपयोग करता है। यह एक अनुरोध ऑब्जेक्ट ( flask.Request ) लेता है, और प्रतिक्रिया पाठ, या मानों का कोई भी सेट लौटाता है जिसे make_response उपयोग करके Response ऑब्जेक्ट में बदला जा सकता है।

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

उदाहरणों की न्यूनतम संख्या निर्धारित करके कोल्ड स्टार्ट को कम करें

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

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

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

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