Check out what’s new from Firebase at Google I/O 2022. Learn more

फ़ंक्शन परिनियोजन और रनटाइम विकल्प प्रबंधित करें

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

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

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

firebase deploy --only functions

डिफ़ॉल्ट रूप से, फायरबेस सीएलआई एक ही समय में 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 परिनियोजित करता है और फ़ाइल से निकाले गए किसी भी फ़ंक्शन को उत्पादन से हटा देता है।

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

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

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

किसी फ़ंक्शन का नाम बदलने के लिए, 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 में चल रहा है।

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

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

  • लीगेसी स्टोरेज onChange इवेंट से onFinalize , onDelete , onArchive और onMetadataUpdate में बदलें। (इसके बारे में बीटा से v1 या v2 अपग्रेड गाइड में और जानें)।
  • एक प्रकार के फायरबेस रीयलटाइम डेटाबेस या क्लाउड फायरस्टोर इवेंट से दूसरे में बदलें, जैसे जेनेरिक onWrite इवेंट से ग्रैनुलर onCreate इवेंट।

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

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

उदाहरण के लिए, यदि आपके पास कोई फ़ंक्शन ऑब्जेक्ट चेंज किया onChange objectChanged प्रकार है, और आप इसे 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

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

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

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

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

  • Node.js 16
  • Node.js 14
  • नोड.जेएस 12
  • नोड.जेएस 10
  • Node.js 8 (8 जून, 2020 को बंद कर दिया गया) Node.js 8 रनटाइम में फ़ंक्शंस का परिनियोजन 15 दिसंबर, 2020 को फायरबेस CLI में अक्षम कर दिया गया था। पहले से ही तैनात कार्यों का निष्पादन भविष्य में किसी बिंदु पर रुक जाएगा; यदि आपने Node.js 8 रनटाइम में फ़ंक्शन परिनियोजित किए हैं, तो हम अनुशंसा करते हैं कि आप Node.js 16 रनटाइम में अपग्रेड करें

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

package.json .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 .json फ़ाइल में engines के मान को बदलें, जो आरंभीकरण के दौरान आपके functions/ निर्देशिका में बनाया गया था। उदाहरण के लिए, यदि आप संस्करण 10 से संस्करण 16 में अपग्रेड कर रहे हैं, तो प्रविष्टि इस तरह दिखनी चाहिए: "engines": {"node": "16"}
  4. वैकल्पिक रूप से, Firebase Local Emulator Suite का उपयोग करके अपने परिवर्तनों का परीक्षण करें।
  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 GHz
  • 2GB - 2.4 GHz
  • 4GB - 4.8 GHz
  • 8GB - 4.8 GHz

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

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