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

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

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

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

$ firebase deploy --only functions

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

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

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

देखें Firebase CLI संदर्भ उपलब्ध आदेशों की पूरी सूची के।

डिफ़ॉल्ट रूप से, Firebase CLI में लग रहा है functions/ स्रोत कोड के लिए फ़ोल्डर। आप में निम्नलिखित लाइनों को जोड़कर किसी अन्य फ़ोल्डर निर्दिष्ट कर सकते हैं firebase.json :

"functions": {
  "source": "another-folder"
}

कार्यों को हटाएं

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

  • स्पष्ट रूप से साथ में Firebase CLI में functions:delete
  • स्पष्ट रूप में संदर्भ मेनू का उपयोग कर कार्यों सूची में Firebase कंसोल में
  • implictly से समारोह को हटाने के द्वारा 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-northeast1

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

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

  • विरासत भंडारण से बदलें onChange को घटना onFinalize , onDelete , onArchive , और onMetadataUpdate । (इस बारे में और जानें V1 या V2 अपग्रेड मार्गदर्शिका को बीटा )।
  • इस तरह के सामान्य रूप में एक दूसरे से, करने के लिए Firebase रीयलटाइम डाटाबेस या बादल Firestore घटना का एक प्रकार से बदलें onWrite बारीक करने के लिए घटना onCreate घटना।

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

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

उदाहरण के लिए, यदि आप था एक समारोह objectChanged कि विरासत है 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

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

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

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

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

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

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

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

  "engines": {"node": "14"}

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

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

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

  1. सुनिश्चित करें कि आपके परियोजना पर है ब्लेज़ मूल्य निर्धारण योजना
  2. सुनिश्चित करें कि आप Firebase CLI v8.6.0 या बाद के संस्करण का उपयोग कर रहे हैं।
  3. बदले engines में मूल्य package.json है कि अपने में बनाया गया था फ़ाइल functions/ निर्देशिका आरंभीकरण के दौरान। : उदाहरण के लिए, यदि आप संस्करण 10 से संस्करण 14 के लिए उन्नयन कर रहे हैं, प्रविष्टि इस तरह दिखना चाहिए "engines": {"node": "14"}
  4. वैकल्पिक रूप से, का उपयोग कर अपने परिवर्तनों का परीक्षण Firebase स्थानीय एम्यूलेटर सुइट
  5. Firebase CLI v8.1.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 के लिए बादल कार्य अपने ऊपर अपने अनुप्रयोग मापता है तो minInstances की स्थापना, आपको लगता है कि सीमा से ऊपर प्रत्येक उदाहरण के लिए एक ठंडी शुरुआत का अनुभव करेंगे।
  • नुकीले ट्रैफ़िक वाले ऐप्स पर कोल्ड स्टार्ट का सबसे गंभीर प्रभाव पड़ता है। अपने अनुप्रयोग काँटेदार ट्रैफ़िक होने और आपके द्वारा सेट किए हैं minInstances पर्याप्त उच्च कि ठंड शुरू होने से प्रत्येक यातायात वृद्धि पर कम हो जाता है महत्व देते हैं, आप काफी विलंबता कम दिखाई देगा। लगातार ट्रैफ़िक वाले ऐप्स के लिए, कोल्ड स्टार्ट से प्रदर्शन पर गंभीर प्रभाव पड़ने की संभावना नहीं है।
  • न्यूनतम इंस्टेंस सेट करना उत्पादन वातावरण के लिए समझ में आता है, लेकिन आमतौर पर परीक्षण वातावरण में इससे बचा जाना चाहिए। अपने परीक्षण परियोजना में शून्य करने के लिए पैमाने पर करने लेकिन अभी भी अपने उत्पादन परियोजना में ठंड शुरू होने से कम हो, तो आप सेट कर सकते हैं minInstances के आधार पर FIREBASE_CONFIG वातावरण चर:

    // 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) में सेट कर सकते हैं।

सेट स्मृति आवंटन और कार्यों स्रोत कोड में समय समाप्त करने के लिए, का उपयोग runWith पैरामीटर बादल कार्य 2.0.0 के लिए Firebase एसडीके में पेश किया। इस क्रम विकल्प एक 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 मिनट। के लिए मान्य मान memory हैं:

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB
  • 4GB
  • 8GB

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

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