पहली पीढ़ी के Node.js फ़ंक्शंस को दूसरी पीढ़ी में अपग्रेड करें

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

इस पृष्ठ के उदाहरण मानते हैं कि आप कॉमनजेएस मॉड्यूल के साथ जावास्क्रिप्ट का उपयोग कर रहे हैं (स्टाइल आयात require ), लेकिन वही सिद्धांत ईएसएम (स्टाइल आयात import … from ) और टाइपस्क्रिप्ट के साथ जावास्क्रिप्ट पर लागू होते हैं।

माइग्रेशन प्रक्रिया

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

फ़ायरबेस सीएलआई और firebase-function संस्करण सत्यापित करें

सुनिश्चित करें कि आप कम से कम फ़ायरबेस सीएलआई संस्करण 12.00 और firebase-functions संस्करण 4.3.0 का उपयोग कर रहे हैं। कोई भी नया संस्करण दूसरी पीढ़ी के साथ-साथ पहली पीढ़ी का भी समर्थन करेगा।

आयात अद्यतन करें

दूसरी पीढ़ी के फ़ंक्शंस firebase-functions SDK में v2 सबपैकेज से आयात होते हैं। फायरबेस सीएलआई को यह निर्धारित करने के लिए इस भिन्न आयात पथ की आवश्यकता है कि आपके फ़ंक्शन कोड को पहली या दूसरी पीढ़ी के फ़ंक्शन के रूप में तैनात किया जाए या नहीं।

v2 उपपैकेज मॉड्यूलर है, और हम केवल उस विशिष्ट मॉड्यूल को आयात करने की अनुशंसा करते हैं जिसकी आपको आवश्यकता है।

पहले: पहली पीढ़ी

const functions = require("firebase-functions");

बाद में: दूसरी पीढ़ी

// explicitly import each trigger
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

ट्रिगर परिभाषाएँ अद्यतन करें

चूंकि दूसरी पीढ़ी का एसडीके मॉड्यूलर आयात का समर्थन करता है, इसलिए पिछले चरण से बदले हुए आयात को प्रतिबिंबित करने के लिए ट्रिगर परिभाषाओं को अपडेट करें।

कुछ ट्रिगर्स के लिए कॉलबैक में दिए गए तर्क बदल गए हैं। इस उदाहरण में, ध्यान दें कि onDocumentCreated कॉलबैक के तर्कों को एक एकल event ऑब्जेक्ट में समेकित किया गया है। इसके अतिरिक्त, कुछ ट्रिगर्स में सुविधाजनक नई कॉन्फ़िगरेशन सुविधाएँ होती हैं, जैसे onRequest ट्रिगर का cors विकल्प।

पहले: पहली पीढ़ी

const functions = require("firebase-functions");

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

exports.uppercase = functions.firestore
  .document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

बाद में: दूसरी पीढ़ी

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

exports.date = onRequest({cors: true}, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

पैरामीटरयुक्त कॉन्फ़िगरेशन का उपयोग करें

दूसरी पीढ़ी के फ़ंक्शंस आपके कोडबेस के अंदर घोषणात्मक रूप से कॉन्फ़िगरेशन पैरामीटर को परिभाषित करने के लिए अधिक सुरक्षित इंटरफ़ेस के पक्ष में functions.config के लिए समर्थन छोड़ देते हैं। नए params मॉड्यूल के साथ, सीएलआई तैनाती को तब तक ब्लॉक कर देता है जब तक कि सभी मापदंडों का एक वैध मान न हो, यह सुनिश्चित करते हुए कि कोई फ़ंक्शन लापता कॉन्फ़िगरेशन के साथ तैनात नहीं किया गया है।

params सबपैकेज में माइग्रेट करें

यदि आप functions.config के साथ पर्यावरण कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो आप अपने मौजूदा कॉन्फ़िगरेशन को पैरामीटरयुक्त कॉन्फ़िगरेशन में स्थानांतरित कर सकते हैं।

पहले: पहली पीढ़ी

const functions = require("firebase-functions");

exports.date = functions.https.onRequest((req, res) => {
  const date = new Date();
  const formattedDate =
date.toLocaleDateString(functions.config().dateformat);

  // ...
});

बाद में: दूसरी पीढ़ी

const {onRequest} = require("firebase-functions/v2/https");
const {defineString} = require("firebase-functions/params");

const dateFormat = defineString("DATE_FORMAT");

exports.date = onRequest((req, res) => {
  const date = new Date();
  const formattedDate = date.toLocaleDateString(dateFormat.value());

  // ...
});

पैरामीटर मान सेट करें

जब आप पहली बार तैनात करते हैं, तो फायरबेस सीएलआई पैरामीटर के सभी मानों के लिए संकेत देता है, और मानों को एक dotenv फ़ाइल में सहेजता है। अपने function.config मानों को निर्यात करने के लिए, firebase functions:config:export चलाएँ।

अतिरिक्त सुरक्षा के लिए, आप पैरामीटर प्रकार और सत्यापन नियम भी निर्दिष्ट कर सकते हैं।

विशेष मामला: एपीआई कुंजियाँ

params मॉड्यूल क्लाउड सीक्रेट मैनेजर के साथ एकीकृत होता है, जो एपीआई कुंजी जैसे संवेदनशील मूल्यों तक सूक्ष्म पहुंच नियंत्रण प्रदान करता है। अधिक जानकारी के लिए गुप्त पैरामीटर देखें.

पहले: पहली पीढ़ी

const functions = require("firebase-functions");

exports.getQuote = functions.https.onRequest(async (req, res) => {
  const quote = await fetchMotivationalQuote(functions.config().apiKey);
  // ...
});

बाद में: दूसरी पीढ़ी

const {onRequest} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");

// Define the secret parameter
const apiKey = defineSecret("API_KEY");

exports.getQuote = onRequest(
  // make the secret available to this function
  { secrets: [apiKey] },
  async (req, res) => {
    // retrieve the value of the secret
    const quote = await fetchMotivationalQuote(apiKey.value());
    // ...
  }
);

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

पहली और दूसरी पीढ़ी के बीच रनटाइम विकल्पों का कॉन्फ़िगरेशन बदल गया है। दूसरी पीढ़ी सभी कार्यों के लिए विकल्प सेट करने की एक नई क्षमता भी जोड़ती है।

पहले: पहली पीढ़ी

const functions = require("firebase-functions");

exports.date = functions
  .runWith({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  })
  // locate function closest to users
  .region("asia-northeast1")
  .https.onRequest((req, res) => {
    // ...
  });

exports.uppercase = functions
  // locate function closest to users and database
  .region("asia-northeast1")
  .firestore.document("my-collection/{docId}")
  .onCreate((change, context) => {
    // ...
  });

बाद में: दूसरी पीढ़ी

const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions/v2");

// locate all functions closest to users
setGlobalOptions({ region: "asia-northeast1" });

exports.date = onRequest({
    // Keep 5 instances warm for this latency-critical function
    minInstances: 5,
  }, (req, res) => {
  // ...
});

exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
  /* ... */
});

समवर्तीता का प्रयोग करें

दूसरी पीढ़ी के फ़ंक्शंस का एक महत्वपूर्ण लाभ एक ही फ़ंक्शन इंस्टेंस की एक बार में एक से अधिक अनुरोधों को पूरा करने की क्षमता है। यह अंतिम उपयोगकर्ताओं द्वारा अनुभव की जाने वाली कोल्ड स्टार्ट की संख्या को नाटकीय रूप से कम कर सकता है। डिफ़ॉल्ट रूप से, समवर्तीता 80 पर सेट है, लेकिन आप इसे 1 से 1000 तक किसी भी मान पर सेट कर सकते हैं:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // set concurrency value
    concurrency: 500
  },
  (req, res) => {
    // ...
});

समवर्ती ट्यूनिंग से प्रदर्शन में सुधार हो सकता है और कार्यों की लागत कम हो सकती है। समवर्ती अनुरोधों की अनुमति दें में समवर्तीता के बारे में और जानें।

वैश्विक चर उपयोग का ऑडिट करें

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

अपग्रेड करते समय, आप अपने फ़ंक्शन के सीपीयू को gcf_gen1 पर सेट कर सकते हैं और पहली पीढ़ी के व्यवहार को पुनर्स्थापित करने के लिए concurrency को 1 पर सेट कर सकते हैं:

const {onRequest} = require("firebase-functions/v2/https");

exports.date = onRequest({
    // TEMPORARY FIX: remove concurrency
    cpu: "gcf_gen1",
    concurrency: 1
  },
  (req, res) => {
    // ...
});

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

ट्रैफ़िक को नई दूसरी पीढ़ी के फ़ंक्शंस पर माइग्रेट करें

जैसे किसी फ़ंक्शन का क्षेत्र या ट्रिगर प्रकार बदलते समय, आपको दूसरी पीढ़ी के फ़ंक्शन को एक नया नाम देना होगा और धीरे-धीरे ट्रैफ़िक को उस पर स्थानांतरित करना होगा।

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

Upgrading from GCFv1 to GCFv2 is not yet supported. Please delete your old function or wait for this feature to be ready.

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

  1. अपने फ़ंक्शन कोड में फ़ंक्शन का नाम बदलें। उदाहरण के लिए, resizeImage नाम बदलकर resizeImageSecondGen कर दें।
  2. फ़ंक्शन को तैनात करें, ताकि मूल पहली पीढ़ी का फ़ंक्शन और दूसरी पीढ़ी का फ़ंक्शन दोनों चल सकें।
    1. कॉल करने योग्य, कार्य कतार और HTTP ट्रिगर के मामले में, दूसरी पीढ़ी के फ़ंक्शन के नाम या यूआरएल के साथ क्लाइंट कोड को अपडेट करके सभी क्लाइंट को दूसरी पीढ़ी के फ़ंक्शन पर इंगित करना शुरू करें।
    2. बैकग्राउंड ट्रिगर्स के साथ, पहली पीढ़ी और दूसरी पीढ़ी दोनों के फ़ंक्शन तैनात होने पर हर घटना पर तुरंत प्रतिक्रिया देंगे।
  3. जब सारा ट्रैफ़िक माइग्रेट हो जाए, तो फ़ायरबेस सीएलआई के firebase functions:delete कमांड का उपयोग करके पहली पीढ़ी के फ़ंक्शन को हटा दें।
    1. वैकल्पिक रूप से, पहली पीढ़ी के फ़ंक्शन के नाम से मेल खाने के लिए दूसरी पीढ़ी के फ़ंक्शन का नाम बदलें।