फ़ंक्शन मैनेज करें


Firebase सीएलआई कमांड का इस्तेमाल करके, फ़ंक्शन को डिप्लॉय, मिटाया जा सकता है, और उनमें बदलाव किया जा सकता है. इसके अलावा, फ़ंक्शन के सोर्स कोड में रनटाइम के विकल्प सेट करके भी ऐसा किया जा सकता है.

फ़ंक्शन डिप्लॉय करें

फ़ंक्शन डिप्लॉय करने के लिए, यह Firebase सीएलआई कमांड चलाएं:

firebase deploy --only functions

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

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

बड़ी संख्या में फ़ंक्शन डिप्लॉय करते समय, स्टैंडर्ड कोटा और एचटीटीपी 429 या 500 गड़बड़ी के मैसेज मिलते हैं. हल करने के लिए इसका इस्तेमाल करके, फ़ंक्शन को 10 या उससे कम के ग्रुप में डिप्लॉय किया जा सकता है.

यहां उपलब्ध पूरी सूची देखने के लिए, Firebase सीएलआई का रेफ़रंस देखें निर्देश देखें.

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

फ़ंक्शन मिटाएं

डिप्लॉय किए गए पुराने फ़ंक्शन को इस तरह मिटाया जा सकता है:

  • Firebase सीएलआई में functions:delete के साथ साफ़ तौर पर
  • साफ़ तौर पर, Google Cloud कंसोल में सबमिट करें.
  • इंप्लिसिट रूप से, डिप्लॉयमेंट से पहले सोर्स से फ़ंक्शन को हटाकर.

मिटाने के सभी ऑपरेशन में, प्रोडक्शन से फ़ंक्शन को हटाने से पहले, आपसे पुष्टि करने के लिए कहा जाता है.

Firebase सीएलआई में एक्सप्लिसिट फ़ंक्शन मिटाने की प्रोसेस के दौरान, कई आर्ग्युमेंट इस्तेमाल किए जा सकते हैं साथ ही, फ़ंक्शन ग्रुप बनाया जा सकता है. इसकी मदद से किसी खास क्षेत्र में चलने वाले फ़ंक्शन के बारे में बताया जा सकता है. इसके अलावा, पुष्टि करने वाले प्रॉम्प्ट को भी बदला जा सकता है.

# 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 आपके सोर्स को पार्स करता है और फ़ाइल से हटाए गए सभी फ़ंक्शन को प्रोडक्शन से हटा देता है.

फ़ंक्शन के नाम, क्षेत्र या ट्रिगर में बदलाव करना

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

फ़ंक्शन का नाम बदलना

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

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

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

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

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/v1');

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

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

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 में चल रहा है.

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

समय के साथ Cloud Functions for Firebase डिप्लॉयमेंट को डेवलप करने पर, आपको कई वजहों से फ़ंक्शन के ट्रिगर टाइप को बदलना पड़ सकता है. उदाहरण के लिए, आप शायद एक तरह के Firebase Realtime Database से बदलना चाहें या किसी अन्य टाइप के लिए Cloud Firestore इवेंट.

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

  1. अपने हिसाब से ट्रिगर करने के तरीके के साथ नया फ़ंक्शन शामिल करने के लिए, सोर्स कोड में बदलाव करें.
  2. ऐसा फ़ंक्शन डिप्लॉय करें जिससे पुराने और नए, दोनों फ़ंक्शन कुछ समय के लिए काम करें.
  3. Firebase CLI का इस्तेमाल करके, प्रोडक्शन से पुराने फ़ंक्शन को साफ़ तौर पर मिटाएं.

उदाहरण के लिए, अगर आपके पास objectChanged नाम का ऐसा Node.js फ़ंक्शन था जिसमें लेगसी onChange इवेंट टाइप, और आपको इसे onFinalize में बदलना है. पहले इसका नाम बदलें फ़ंक्शन को चुनकर onFinalize इवेंट टाइप के लिए उसमें बदलाव करें.

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

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

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

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

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

Cloud Functions for Firebase की मदद से, Node.js जैसे रनटाइम के विकल्प चुने जा सकते हैं रनटाइम वर्शन और हर फ़ंक्शन के लिए टाइम आउट, मेमोरी का बंटवारा, और कम से कम/ज़्यादा से ज़्यादा स्टोरेज फ़ंक्शन के इंस्टेंस.

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

अगर आपके डेवलपमेंट वर्कफ़्लो में, इसके ज़रिए रनटाइम के विकल्पों को मैन्युअल तौर पर सेट करना शामिल है, तो Google Cloud Console या gcloud सीएलआई और आपको ये वैल्यू नहीं चाहिए हर डिप्लॉयमेंट पर ओवरराइड होने के बाद, preserveExternalChanges विकल्प को true पर सेट करें. इस विकल्प को true पर सेट करने पर, Firebase आपके ऐप्लिकेशन में सेट किए गए रनटाइम के विकल्पों को मर्ज कर देता है कोड को आपके फ़ंक्शन के वर्तमान में डिप्लॉय किए गए वर्शन की सेटिंग के साथ निम्न प्राथमिकता:

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

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

Node.js वर्शन सेट करें

Cloud Functions के लिए Firebase SDK टूल की मदद से, Node.js रनटाइम को चुना जा सकता है. आपके पास किसी प्रोजेक्ट में सभी फ़ंक्शन को, सिर्फ़ इनमें से किसी एक काम करने वाले Node.js वर्शन के रनटाइम एनवायरमेंट पर चलाने का विकल्प होता है:

  • Node.js 20 (झलक)
  • Node.js 18
  • Node.js 16
  • Node.js 14

Node.js वर्शन को सेट करने के लिए:

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

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

अगर Yarn पैकेज मैनेजर का इस्तेमाल किया जा रहा है या engines फ़ील्ड के लिए आपकी कुछ और ज़रूरी शर्तें हैं, तो firebase.json में Cloud Functions के लिए Firebase SDK टूल का रनटाइम सेट किया जा सकता है:

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

सीएलआई, firebase.json में सेट की गई वैल्यू को किसी भी वैल्यू या जिसकी सीमा आपने package.json में अलग से सेट की है.

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

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

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

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

डिफ़ॉल्ट रूप से, Cloud Functions for Firebase आने वाले अनुरोधों की संख्या के आधार पर, चल रहे इंस्टेंस की संख्या को बढ़ाता है. ट्रैफ़िक कम होने पर, यह संख्या शून्य तक भी हो सकती है. हालांकि, अगर आपका ऐप्लिकेशन इस्तेमाल करने के लिए कम कोल्ड स्टार्ट की संख्या को कम करना है और आपको कंटेनर इंस्टेंस की कम से कम संख्या तय करके डिफ़ॉल्ट व्यवहार गर्म रखा और अनुरोधों को पूरा करने के लिए तैयार है.

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

कोल्ड स्टार्ट की संख्या कम करना

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

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 के लिए वैल्यू सेट करते समय, इन बातों का ध्यान रखें:

  • अगर Cloud Functions for Firebase आपके ऐप्लिकेशन को 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
    });

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

ज़्यादा से ज़्यादा इंस्टेंस सेटिंग इस्तेमाल करने के सबसे सही तरीकों के बारे में ज़्यादा जानने के लिए, इन्हें छोड़ दो maxInstances को इस्तेमाल करने के सबसे सही तरीके.

टाइम आउट और मेमोरी ऐलोकेशन सेट करना

कुछ मामलों में, लंबे टाइम आउट के लिए, आपके फ़ंक्शन के लिए खास शर्तें हो सकती हैं या बहुत ज़्यादा मेमोरी का इस्तेमाल होता हो. इन वैल्यू को Google Cloud Console या फ़ंक्शन के सोर्स कोड (सिर्फ़ Firebase) में सेट किया जा सकता है.

फ़ंक्शन के सोर्स कोड में, मेमोरी का ऐलोकेशन और टाइम आउट सेट करने के लिए, runWith Cloud Functions के 2.0.0 वर्शन के लिए, Firebase SDK टूल में पैरामीटर पेश किया गया. यह रनटाइम विकल्प स्वीकार करता है एक JSON ऑब्जेक्ट जो RuntimeOptions इंटरफ़ेस, जो timeoutSeconds और memory की वैल्यू बताता है. उदाहरण के लिए, यह स्टोरेज फ़ंक्शन 1 जीबी मेमोरी का इस्तेमाल करता है और 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 यानी नौ मिनट हो सकती है. किसी फ़ंक्शन को दी गई मेमोरी, उस फ़ंक्शन के लिए तय किए गए सीपीयू से मेल खाती है. इस बारे में memory के लिए मान्य वैल्यू की इस सूची में बताया गया है:

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

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

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