फ़ंक्शन प्रबंधित करें


आप फायरबेस सीएलआई कमांड का उपयोग करके या अपने फ़ंक्शन स्रोत कोड में रनटाइम विकल्प सेट करके फ़ंक्शन को तैनात, हटा और संशोधित कर सकते हैं।

कार्यों को तैनात करें

फ़ंक्शंस को तैनात करने के लिए, यह फ़ायरबेस सीएलआई कमांड चलाएँ:

firebase deploy --only functions

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

firebase deploy --only functions:addMessage,functions:makeUppercase

बड़ी संख्या में फ़ंक्शन तैनात करते समय, आप मानक कोटा पार कर सकते हैं और HTTP 429 या 500 त्रुटि संदेश प्राप्त कर सकते हैं। इसे हल करने के लिए, फ़ंक्शंस को 10 या उससे कम के समूहों में तैनात करें।

उपलब्ध कमांड की पूरी सूची के लिए फायरबेस सीएलआई संदर्भ देखें।

डिफ़ॉल्ट रूप से, फायरबेस सीएलआई स्रोत कोड के लिए functions/ फ़ोल्डर में दिखता है। यदि आप चाहें, तो आप फ़ंक्शन को कोडबेस या फ़ाइलों के एकाधिक सेट में व्यवस्थित कर सकते हैं।

फ़ंक्शंस हटाएं

आप पहले से तैनात फ़ंक्शंस को इन तरीकों से हटा सकते हैं:

  • फ़ंक्शंस के साथ फ़ायरबेस सीएलआई में स्पष्ट रूप से functions:delete
  • स्पष्ट रूप से Google क्लाउड कंसोल में।
  • तैनाती से पहले स्रोत से फ़ंक्शन को हटाकर

सभी विलोपन कार्रवाइयां आपको फ़ंक्शन को उत्पादन से हटाने से पहले पुष्टि करने के लिए प्रेरित करती हैं।

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

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

अंतर्निहित फ़ंक्शन विलोपन के साथ, firebase deploy आपके स्रोत को पार्स करता है और फ़ाइल से हटाए गए किसी भी फ़ंक्शन को उत्पादन से हटा देता है।

किसी फ़ंक्शन का नाम, क्षेत्र या ट्रिगर संशोधित करें

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

किसी फ़ंक्शन का नाम बदलें

किसी फ़ंक्शन का नाम बदलने के लिए, अपने स्रोत में फ़ंक्शन का एक नया नामांकित संस्करण बनाएं और फिर दो अलग-अलग परिनियोजन कमांड चलाएँ। पहला कमांड नए नामित फ़ंक्शन को तैनात करता है, और दूसरा कमांड पहले से तैनात संस्करण को हटा देता है। उदाहरण के लिए, यदि आपके पास webhook नामक Node.js फ़ंक्शन है जिसे आप webhookNew में बदलना चाहते हैं, तो कोड को निम्नानुसार संशोधित करें:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

फिर नए फ़ंक्शन को तैनात करने के लिए निम्नलिखित कमांड चलाएँ:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

किसी फ़ंक्शन का क्षेत्र या क्षेत्र बदलें

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

  1. फ़ंक्शन का नाम बदलें, और उसके क्षेत्र या क्षेत्रों को इच्छानुसार बदलें।
  2. पुनर्नामित फ़ंक्शन को तैनात करें, जिसके परिणामस्वरूप क्षेत्रों के दोनों सेटों में अस्थायी रूप से समान कोड चल रहा है।
  3. पिछला फ़ंक्शन हटाएं.

उदाहरण के लिए, यदि आपके पास webhook नामक एक फ़ंक्शन है जो वर्तमान में us-central1 के डिफ़ॉल्ट फ़ंक्शन क्षेत्र में है, और आप इसे asia-northeast1 में स्थानांतरित करना चाहते हैं, तो आपको फ़ंक्शन का नाम बदलने और क्षेत्र को संशोधित करने के लिए पहले अपने स्रोत कोड को संशोधित करना होगा .

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

फिर चलाकर तैनात करें:

firebase deploy --only functions:webhookAsia

अब दो समान फ़ंक्शन चल रहे हैं: webhook us-central1 में चल रहा है, और webhookAsia asia-northeast1 में चल रहा है।

फिर, webhook हटाएं:

firebase functions:delete webhook

अब केवल एक ही फ़ंक्शन है - webhookAsia , जो asia-northeast1 में चल रहा है।

किसी फ़ंक्शन का ट्रिगर प्रकार बदलें

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

केवल स्रोत कोड को बदलकर और firebase deploy चलाकर किसी फ़ंक्शन के ईवेंट प्रकार को बदलना संभव नहीं है। त्रुटियों से बचने के लिए, इस प्रक्रिया द्वारा फ़ंक्शन के ट्रिगर प्रकार को बदलें:

  1. वांछित ट्रिगर प्रकार के साथ एक नया फ़ंक्शन शामिल करने के लिए स्रोत कोड को संशोधित करें।
  2. फ़ंक्शन को तैनात करें, जिसके परिणामस्वरूप पुराने और नए दोनों फ़ंक्शन अस्थायी रूप से चलेंगे।
  3. फायरबेस सीएलआई का उपयोग करके पुराने फ़ंक्शन को स्पष्ट रूप से उत्पादन से हटा दें।

उदाहरण के लिए, यदि आपके पास objectChanged नामक एक Node.js फ़ंक्शन है जिसमें विरासत onChange ईवेंट प्रकार है, और आप इसे onFinalize में बदलना चाहते हैं, तो पहले फ़ंक्शन का नाम बदलें और इसे onFinalize ईवेंट प्रकार के लिए संपादित करें।

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

फिर पुराने फ़ंक्शन को हटाने से पहले, नया फ़ंक्शन बनाने के लिए निम्नलिखित कमांड चलाएँ:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

रनटाइम विकल्प सेट करें

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

सर्वोत्तम अभ्यास के रूप में, इन विकल्पों (Node.js संस्करण को छोड़कर) को फ़ंक्शन कोड के अंदर कॉन्फ़िगरेशन ऑब्जेक्ट पर सेट किया जाना चाहिए। यह RuntimeOptions ऑब्जेक्ट आपके फ़ंक्शन के रनटाइम विकल्पों के लिए सत्य का स्रोत है, और किसी अन्य विधि (जैसे Google क्लाउड कंसोल या gcloud CLI के माध्यम से) के माध्यम से सेट किए गए विकल्पों को ओवरराइड करेगा।

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

  1. विकल्प फ़ंक्शन कोड में सेट है: बाहरी परिवर्तनों को ओवरराइड करें।
  2. फ़ंक्शन कोड में विकल्प RESET_VALUE पर सेट है: डिफ़ॉल्ट मान के साथ बाहरी परिवर्तनों को ओवरराइड करें।
  3. विकल्प फ़ंक्शन कोड में सेट नहीं है, लेकिन वर्तमान में तैनात फ़ंक्शन में सेट है: तैनात फ़ंक्शन में निर्दिष्ट विकल्प का उपयोग करें।

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

Node.js संस्करण सेट करें

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

  • नोड.जेएस 20 (पूर्वावलोकन)
  • नोड.जेएस 18
  • नोड.जेएस 16
  • नोड.जेएस 14

Node.js संस्करण सेट करने के लिए:

आप संस्करण को package.json फ़ाइल में engines फ़ील्ड में सेट कर सकते हैं जो आरंभीकरण के दौरान आपके functions/ निर्देशिका में बनाया गया था। उदाहरण के लिए, केवल संस्करण 18 का उपयोग करने के लिए, इस पंक्ति को package.json में संपादित करें:

  "engines": {"node": "18"}

यदि आप यार्न पैकेज मैनेजर का उपयोग कर रहे हैं या engines क्षेत्र के लिए अन्य विशिष्ट आवश्यकताएं हैं, तो आप इसके बजाय firebase.json में क्लाउड फ़ंक्शंस के लिए फायरबेस एसडीके के लिए रनटाइम सेट कर सकते हैं:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

सीएलआई आपके द्वारा package.json में अलग से सेट किए गए किसी भी मान या श्रेणी की प्राथमिकता में firebase.json में निर्धारित मान का उपयोग करता है।

अपने Node.js रनटाइम को अपग्रेड करें

अपने Node.js रनटाइम को अपग्रेड करने के लिए:

  1. सुनिश्चित करें कि आपका प्रोजेक्ट ब्लेज़ मूल्य निर्धारण योजना पर है।
  2. सुनिश्चित करें कि आप Firebase CLI v11.18.0 या बाद के संस्करण का उपयोग कर रहे हैं।
  3. package.json फ़ाइल में engines मान बदलें जो आरंभीकरण के दौरान आपके functions/ निर्देशिका में बनाया गया था। उदाहरण के लिए, यदि आप संस्करण 16 से संस्करण 18 में अपग्रेड कर रहे हैं, तो प्रविष्टि इस तरह दिखनी चाहिए: "engines": {"node": "18"}
  4. वैकल्पिक रूप से, फायरबेस लोकल एमुलेटर सूट का उपयोग करके अपने परिवर्तनों का परीक्षण करें।
  5. सभी कार्यों को पुनः तैनात करें.

स्केलिंग व्यवहार को नियंत्रित करें

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

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

सर्दी शुरू होने की संख्या कम करें

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

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

minInstances के लिए मान सेट करते समय विचार करने योग्य कुछ बातें यहां दी गई हैं:

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

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

किसी फ़ंक्शन के लिए उदाहरणों की अधिकतम संख्या सीमित करें

फ़ंक्शन स्रोत कोड में अधिकतम इंस्टेंस सेट करने के लिए, runWith विधि का उपयोग करें। यह विधि RuntimeOptions इंटरफ़ेस के अनुरूप JSON ऑब्जेक्ट को स्वीकार करती है, जो maxInstances के लिए मानों को परिभाषित करती है। उदाहरण के लिए, यह फ़ंक्शन किसी काल्पनिक विरासत डेटाबेस को प्रभावित न करने के लिए 100 उदाहरणों की सीमा निर्धारित करता है:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

यदि किसी HTTP फ़ंक्शन को maxInstances सीमा तक बढ़ाया जाता है, तो नए अनुरोधों को 30 सेकंड के लिए कतारबद्ध किया जाता है और फिर यदि तब तक कोई उदाहरण उपलब्ध नहीं होता है 429 Too Many Requests के प्रतिक्रिया कोड के साथ अस्वीकार कर दिया जाता है।

अधिकतम इंस्टेंस सेटिंग्स का उपयोग करने के लिए सर्वोत्तम प्रथाओं के बारे में अधिक जानने के लिए, maxInstances उपयोग करने के लिए इन सर्वोत्तम प्रथाओं को देखें।

टाइमआउट और मेमोरी आवंटन सेट करें

कुछ मामलों में, आपके फ़ंक्शन में लंबे टाइमआउट मान या मेमोरी के बड़े आवंटन के लिए विशेष आवश्यकताएं हो सकती हैं। आप इन मानों को या तो Google क्लाउड कंसोल में या फ़ंक्शन स्रोत कोड (केवल फ़ायरबेस) में सेट कर सकते हैं।

फ़ंक्शंस स्रोत कोड में मेमोरी आवंटन और टाइमआउट सेट करने के लिए, क्लाउड फ़ंक्शंस 2.0.0 के लिए फायरबेस एसडीके में पेश किए गए runWith पैरामीटर का उपयोग करें। यह रनटाइम विकल्प RuntimeOptions इंटरफ़ेस के अनुरूप JSON ऑब्जेक्ट को स्वीकार करता है, जो timeoutSeconds और memory के लिए मानों को परिभाषित करता है। उदाहरण के लिए, यह स्टोरेज फ़ंक्शन 1GB मेमोरी का उपयोग करता है और 300 सेकंड के बाद टाइम आउट हो जाता है:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

timeoutSeconds का अधिकतम मान 540 या 9 मिनट है। किसी फ़ंक्शन को दी गई मेमोरी की मात्रा फ़ंक्शन के लिए आवंटित सीपीयू से मेल खाती है, जैसा कि memory के लिए मान्य मानों की इस सूची में बताया गया है:

  • 128MB - 200 मेगाहर्ट्ज
  • 256MB - 400 मेगाहर्ट्ज
  • 512MB - 800 मेगाहर्ट्ज
  • 1GB - 1.4 गीगाहर्ट्ज़
  • 2GB - 2.4 गीगाहर्ट्ज
  • 4GB - 4.8 गीगाहर्ट्ज
  • 8GB - 4.8 गीगाहर्ट्ज़

Google क्लाउड कंसोल में मेमोरी आवंटन और टाइमआउट सेट करने के लिए:

  1. Google Google क्लाउड कंसोल में बाएं मेनू से क्लाउड फ़ंक्शंस चुनें।
  2. फ़ंक्शन सूची में किसी फ़ंक्शन के नाम पर क्लिक करके उसका चयन करें।
  3. शीर्ष मेनू में संपादन आइकन पर क्लिक करें।
  4. मेमोरी आवंटित लेबल वाले ड्रॉप-डाउन मेनू से मेमोरी आवंटन का चयन करें।
  5. उन्नत विकल्प प्रदर्शित करने के लिए अधिक पर क्लिक करें, और टाइमआउट टेक्स्ट बॉक्स में कई सेकंड दर्ज करें।
  6. फ़ंक्शन को अद्यतन करने के लिए सहेजें पर क्लिक करें।