Firebase सीएलआई कमांड का इस्तेमाल करके, फ़ंक्शन को डिप्लॉय, मिटाया जा सकता है, और उनमें बदलाव किया जा सकता है. इसके अलावा, फ़ंक्शन के सोर्स कोड में रनटाइम के विकल्प सेट करके भी ऐसा किया जा सकता है.
फ़ंक्शन डिप्लॉय करना
फ़ंक्शन डिप्लॉय करने के लिए, यह Firebase सीएलआई कमांड चलाएं:
firebase deploy --only functions
डिफ़ॉल्ट रूप से, Firebase CLI आपके सोर्स में मौजूद सभी फ़ंक्शन को एक साथ डिप्लॉय करता है. अगर आपके प्रोजेक्ट में पांच से ज़्यादा फ़ंक्शन हैं, तो हमारा सुझाव है कि आप --only
फ़्लैग का इस्तेमाल करके, सिर्फ़ उन फ़ंक्शन को डिप्लॉय करें जिनमें आपने बदलाव किया है. इसके लिए, फ़ंक्शन के नामों का इस्तेमाल करें. खास फ़ंक्शन डिप्लॉय करना
इससे डिप्लॉयमेंट की प्रोसेस तेज़ होती है और डिप्लॉयमेंट कोटा से बचने में मदद मिलती है. उदाहरण के लिए:
firebase deploy --only functions:addMessage,functions:makeUppercase
बड़ी संख्या में फ़ंक्शन डिप्लॉय करने पर, हो सकता है कि आप स्टैंडर्ड कोटा से ज़्यादा फ़ंक्शन डिप्लॉय कर दें. ऐसा होने पर, आपको एचटीटीपी 429 या 500 गड़बड़ी के मैसेज मिल सकते हैं. इस समस्या को हल करने के लिए, फ़ंक्शन को 10 या उससे कम के ग्रुप में डिप्लॉय करें.
उपलब्ध निर्देशों की पूरी सूची के लिए, Firebase सीएलआई रेफ़रंस देखें.
डिफ़ॉल्ट रूप से, Firebase सीएलआई, सोर्स कोड के लिए functions/
फ़ोल्डर में खोजता है. अगर आप चाहें, तो कोडबेस या फ़ाइलों के कई सेट में फ़ंक्शन व्यवस्थित किए जा सकते हैं.
फ़ंक्शन मिटाना
पहले से डिप्लॉय किए गए फ़ंक्शन को इन तरीकों से मिटाया जा सकता है:
functions:delete
के साथ Firebase सीएलआई में साफ़ तौर पर- Google Cloud कंसोल में साफ़ तौर पर.
- डिप्लॉयमेंट से पहले, सोर्स से फ़ंक्शन को हटाकर अनजाने में.
मिटाने के सभी ऑपरेशन में, प्रोडक्शन से फ़ंक्शन को हटाने से पहले, आपसे पुष्टि करने के लिए कहा जाता है.
Firebase CLI में, साफ़ तौर पर फ़ंक्शन मिटाने की सुविधा, एक से ज़्यादा आर्ग्युमेंट के साथ-साथ फ़ंक्शन ग्रुप के साथ काम करती है. साथ ही, यह आपको किसी खास इलाके में चल रहे फ़ंक्शन के बारे में बताने की सुविधा देती है. इसके अलावा, पुष्टि करने के लिए प्रॉम्प्ट को बदला भी जा सकता है.
# 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/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
किसी फ़ंक्शन के इलाके या इलाकों को बदलना
अगर किसी ऐसे फ़ंक्शन के लिए तय किए गए इलाकों को बदला जा रहा है जो प्रोडक्शन ट्रैफ़िक को मैनेज कर रहा है, तो इवेंट के नुकसान से बचने के लिए, यह तरीका अपनाएं:
- फ़ंक्शन का नाम बदलें और अपनी पसंद के मुताबिक उसके क्षेत्र या क्षेत्रों में बदलाव करें.
- नाम बदले गए फ़ंक्शन को डिप्लॉय करें. इससे क्षेत्रों के दोनों सेट में, कुछ समय के लिए एक ही कोड चलता है.
- पिछला फ़ंक्शन मिटाएं.
उदाहरण के लिए, अगर आपके पास 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
को चलाकर, किसी फ़ंक्शन के इवेंट टाइप को बदला नहीं जा सकता. गड़बड़ियों से बचने के लिए, इस तरीके से फ़ंक्शन के ट्रिगर टाइप में बदलाव करें:
- सोर्स कोड में बदलाव करके, अपने हिसाब से ट्रिगर टाइप के साथ नया फ़ंक्शन शामिल करें.
- फ़ंक्शन को डिप्लॉय करें. इससे, कुछ समय के लिए पुराने और नए, दोनों फ़ंक्शन चलेंगे.
- 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 CLI के ज़रिए मैन्युअल रूप से रनटाइम के विकल्प सेट करने की सुविधा शामिल है और आपको हर डिप्लॉयमेंट पर इन वैल्यू को बदलना नहीं है, तो preserveExternalChanges
विकल्प को true
पर सेट करें.
इस विकल्प को true
पर सेट करने पर, Firebase आपके कोड में सेट किए गए रनटाइम विकल्पों को, आपके फ़ंक्शन के फ़िलहाल डिप्लॉय किए गए वर्शन की सेटिंग के साथ मर्ज करता है. ऐसा इस प्राथमिकता के साथ किया जाता है:
- विकल्प, फ़ंक्शन कोड में सेट किया गया है: बाहरी बदलावों को बदलें.
- फ़ंक्शन कोड में विकल्प
RESET_VALUE
पर सेट है: बाहरी बदलावों को डिफ़ॉल्ट वैल्यू से बदलें. - विकल्प, फ़ंक्शन कोड में सेट नहीं है, लेकिन फ़िलहाल डिप्लॉय किए गए फ़ंक्शन में सेट है: डिप्लॉय किए गए फ़ंक्शन में बताए गए विकल्प का इस्तेमाल करें.
ज़्यादातर मामलों में, 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
}
}
सीएलआई, package.json
में अलग से सेट की गई किसी भी वैल्यू या रेंज के बजाय, firebase.json
में सेट की गई वैल्यू का इस्तेमाल करता है.
अपना Node.js रनटाइम अपग्रेड करना
Node.js रनटाइम को अपग्रेड करने के लिए:
- पक्का करें कि आपका प्रोजेक्ट, Blaze के प्लान पर हो.
- पक्का करें कि आपके पास Firebase CLI का 11.18.0 या इसके बाद का वर्शन हो.
package.json
फ़ाइल मेंengines
वैल्यू बदलें. यह फ़ाइल, शुरू करने के दौरान आपकीfunctions/
डायरेक्ट्री में बनाई गई थी. उदाहरण के लिए, अगर आपको वर्शन 16 से वर्शन 18 पर अपग्रेड करना है, तो एंट्री कुछ ऐसी दिखनी चाहिए:"engines": {"node": "18"}
- इसके अलावा, Firebase Local Emulator Suite का इस्तेमाल करके, अपने बदलावों की जांच की जा सकती है.
- सभी फ़ंक्शन फिर से डिप्लॉय करें.
स्केलिंग के व्यवहार को कंट्रोल करना
डिफ़ॉल्ट रूप से, Cloud Functions for Firebase आने वाले अनुरोधों की संख्या के आधार पर, चल रहे इंस्टेंस की संख्या को बढ़ाता है. ट्रैफ़िक कम होने पर, यह संख्या शून्य तक भी हो सकती है. हालांकि, अगर आपके ऐप्लिकेशन के लिए इंतज़ार का समय कम करना ज़रूरी है और आपको कोल्ड स्टार्ट की संख्या सीमित करनी है, तो इस डिफ़ॉल्ट व्यवहार को बदला जा सकता है. इसके लिए, कम से कम उतने कंटेनर इंस्टेंस तय करें जिन्हें अनुरोधों को पूरा करने के लिए, चालू रखा जा सके.
इसी तरह, आने वाले अनुरोधों के जवाब में इंस्टेंस को स्केल करने की सीमा तय करने के लिए, ज़्यादा से ज़्यादा संख्या सेट की जा सकती है. इस सेटिंग का इस्तेमाल करके, अपनी लागत को कंट्रोल करें या डेटाबेस जैसी बैकिंग सेवा के कनेक्शन की संख्या को सीमित करें.
कोल्ड स्टार्ट की संख्या कम करना
सोर्स कोड में किसी फ़ंक्शन के लिए कम से कम इंस्टेंस सेट करने के लिए, runWith
तरीके का इस्तेमाल करें. यह तरीका, RuntimeOptions
इंटरफ़ेस के मुताबिक JSON ऑब्जेक्ट स्वीकार करता है. यह इंटरफ़ेस, 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) में सेट किया जा सकता है.
फ़ंक्शन के सोर्स कोड में मेमोरी ऐलोकेशन और टाइम आउट सेट करने के लिए, Cloud Functions 2.0.0 के लिए Firebase SDK में पेश किए गए runWith
पैरामीटर का इस्तेमाल करें. रनटाइम के लिए यह विकल्प, RuntimeOptions
इंटरफ़ेस के मुताबिक JSON ऑब्जेक्ट स्वीकार करता है. यह इंटरफ़ेस, 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 कंसोल में मेमोरी ऐलोकेशन और टाइम आउट सेट करने के लिए:
- Google Google Cloud कंसोल में, बाएं मेन्यू से Cloud Functions चुनें.
- फ़ंक्शन की सूची में, किसी फ़ंक्शन के नाम पर क्लिक करके उसे चुनें.
- सबसे ऊपर मौजूद मेन्यू में, बदलाव करें आइकॉन पर क्लिक करें.
- मेमोरी का बंटवारा लेबल वाले ड्रॉप-डाउन मेन्यू से, मेमोरी का बंटवारा चुनें.
- बेहतर विकल्प देखने के लिए, ज़्यादा पर क्लिक करें. इसके बाद, टाइम आउट टेक्स्ट बॉक्स में सेकंड डालें.
- फ़ंक्शन को अपडेट करने के लिए, सेव करें पर क्लिक करें.