获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

कार्यों का प्रबंधन करें

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

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

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

firebase deploy --only functions

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

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

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

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

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

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

आप पहले से परिनियोजित कार्यों को इन तरीकों से हटा सकते हैं:

  • स्पष्ट रूप से functions:delete
  • स्पष्ट रूप से Google क्लाउड कंसोल में।
  • परिनियोजन index.js से फ़ंक्शन को हटाकर।

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

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

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

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

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

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

किसी फ़ंक्शन का नाम बदलने के लिए, index.js में फ़ंक्शन का नया बदला हुआ संस्करण बनाएं और फिर दो अलग-अलग परिनियोजन कमांड चलाएँ। पहला कमांड नए नामित फ़ंक्शन को तैनात करता है, और दूसरा कमांड पहले से तैनात संस्करण को हटा देता है। उदाहरण के लिए, यदि आपके पास webhook 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 asia-northeast1 में चल रहा है।

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

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

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

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

उदाहरण के लिए, यदि आपके पास एक फ़ंक्शन objectChanged किया गया है जिसमें लीगेसी ऑन चेंज ईवेंट प्रकार है, और आप इसे अंतिम रूप देना onFinalize हैं, तो पहले फ़ंक्शन का नाम बदलें और इसे onChange ईवेंट प्रकार 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 क्लाउड कंसोल या जीक्लाउड सीएलआई के माध्यम से) के माध्यम से सेट किए गए विकल्पों को ओवरराइड करेगा।

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

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

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

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

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

  • नोड.जेएस 16
  • नोड.जेएस 14

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

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

  "engines": {"node": "16"}

engines फ़ील्ड आवश्यक है; कार्यों को तैनात करने और चलाने के लिए इसे समर्थित Node.js संस्करणों में से एक को निर्दिष्ट करना होगा। वर्तमान में firebase init functions इस फ़ील्ड को 16 पर सेट करता है।

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

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

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

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

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

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

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

स्रोत कोड में किसी फ़ंक्शन के लिए न्यूनतम संख्या में इंस्टेंस सेट करने के लिए, runWith विधि का उपयोग करें। यह विधि एक JSON ऑब्जेक्ट को RuntimeOptions इंटरफ़ेस के अनुरूप स्वीकार करती है, जो 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 के लिए मान सेट करते समय कुछ बातों का ध्यान रखना चाहिए:

  • अगर Firebase के लिए Cloud Functions आपके ऐप को आपकी 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 विधि का उपयोग करें। यह विधि एक JSON ऑब्जेक्ट को स्वीकार करती है जो RuntimeOptions इंटरफ़ेस के अनुरूप है, जो 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 क्लाउड कंसोल में या फ़ंक्शन स्रोत कोड (केवल Firebase) में सेट कर सकते हैं।

फ़ंक्शन स्रोत कोड में मेमोरी आवंटन और टाइमआउट सेट करने के लिए, क्लाउड फ़ंक्शंस 2.0.0 के लिए फायरबेस एसडीके में पेश किए गए runWith पैरामीटर का उपयोग करें। यह रनटाइम विकल्प एक JSON ऑब्जेक्ट को स्वीकार करता है जो RuntimeOptions इंटरफ़ेस के अनुरूप है, जो 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 मिनट है। किसी फ़ंक्शन को दी गई मेमोरी की मात्रा फ़ंक्शन के लिए आवंटित CPU से मेल खाती है, जैसा कि 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. फ़ंक्शन को अपडेट करने के लिए सहेजें पर क्लिक करें।