1st gen Node.js ফাংশনগুলিকে 2nd gen-এ আপগ্রেড করুন৷

যে অ্যাপগুলি বর্তমানে 1st gen ফাংশন ব্যবহার করছে তাদের এই গাইডের নির্দেশাবলী ব্যবহার করে 2nd gen-এ স্থানান্তরিত করার কথা বিবেচনা করা উচিত৷ 2nd জেনার ফাংশনগুলি আরও ভাল পারফরম্যান্স, ভাল কনফিগারেশন, আরও ভাল পর্যবেক্ষণ এবং আরও অনেক কিছু প্রদান করতে ক্লাউড রান ব্যবহার করে।

এই পৃষ্ঠার উদাহরণগুলি অনুমান করে যে আপনি কমনজেএস মডিউলগুলির সাথে জাভাস্ক্রিপ্ট ব্যবহার করছেন (শৈলী আমদানি require ), তবে একই নীতিগুলি ESM সহ জাভাস্ক্রিপ্টে প্রযোজ্য ( import … from ) এবং টাইপস্ক্রিপ্ট।

মাইগ্রেশন প্রক্রিয়া

1st gen এবং 2nd gen ফাংশন একই ফাইলে পাশাপাশি থাকতে পারে। এটি টুকরো টুকরো সহজ মাইগ্রেশনের অনুমতি দেয়, যেহেতু আপনি প্রস্তুত। আমরা একটি সময়ে একটি ফাংশন স্থানান্তর করার পরামর্শ দিই, এগিয়ে যাওয়ার আগে পরীক্ষা এবং যাচাইকরণ সম্পাদন করুন৷

ফায়ারবেস সিএলআই এবং firebase-function এর সংস্করণগুলি যাচাই করুন

নিশ্চিত করুন যে আপনি অন্তত Firebase CLI সংস্করণ 12.00 এবং firebase-functions সংস্করণ 4.3.0 ব্যবহার করছেন। যেকোনো নতুন সংস্করণ 2nd gen এর পাশাপাশি 1st gen কে সমর্থন করবে৷

আমদানি আপডেট করুন

firebase-functions SDK-তে v2 সাবপ্যাকেজ থেকে ২য় জেনার ফাংশন আমদানি করা হয়। এই ভিন্ন আমদানি পথটি হল Firebase CLI-কে আপনার ফাংশন কোডটি 1st বা 2nd gen ফাংশন হিসাবে স্থাপন করতে হবে কিনা তা নির্ধারণ করতে।

v2 সাবপ্যাকেজটি মডুলার, এবং আমরা শুধুমাত্র আপনার প্রয়োজনীয় নির্দিষ্ট মডিউলটি আমদানি করার পরামর্শ দিই।

আগে: ১ম জেনারেশন

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

পরে: 2য় প্রজন্ম

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

ট্রিগার সংজ্ঞা আপডেট করুন

যেহেতু ২য় প্রজন্মের SDK মডুলার আমদানির পক্ষে, তাই পূর্ববর্তী ধাপ থেকে পরিবর্তিত আমদানি প্রতিফলিত করতে ট্রিগার সংজ্ঞা আপডেট করুন।

কিছু ট্রিগারের জন্য কলব্যাকে পাস করা আর্গুমেন্ট পরিবর্তিত হয়েছে। এই উদাহরণে, মনে রাখবেন যে 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) => {
    // ...
  });

পরে: 2য় প্রজন্ম

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) => {
  /* ... */
});

প্যারামিটারাইজড কনফিগারেশন ব্যবহার করুন

আপনার কোডবেসের ভিতরে ঘোষণামূলকভাবে কনফিগারেশন পরামিতিগুলিকে সংজ্ঞায়িত করার জন্য আরও নিরাপদ ইন্টারফেসের পক্ষে 2য় জেন ফাংশন functions.config এর জন্য সমর্থন ড্রপ করে। নতুন params মডিউলের সাথে, সমস্ত প্যারামিটারের একটি বৈধ মান না থাকলে CLI ডিপ্লয়মেন্ট ব্লক করে, নিশ্চিত করে যে কোনও ফাংশন অনুপস্থিত কনফিগারেশনের সাথে স্থাপন করা হয়নি।

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);

  // ...
});

পরে: 2য় প্রজন্ম

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());

  // ...
});

প্যারামিটার মান সেট করুন

আপনি যখন প্রথমবার স্থাপন করেন, Firebase CLI প্যারামিটারের সমস্ত মানগুলির জন্য অনুরোধ করে এবং একটি dotenv ফাইলে মানগুলি সংরক্ষণ করে৷ আপনার functions.config মান রপ্তানি করতে, firebase functions:config:export চালান।

অতিরিক্ত নিরাপত্তার জন্য, আপনি প্যারামিটারের ধরন এবং বৈধতার নিয়মও উল্লেখ করতে পারেন।

বিশেষ ক্ষেত্রে: API কী

params মডিউল ক্লাউড সিক্রেট ম্যানেজারের সাথে একীভূত হয়, যা API কীগুলির মতো সংবেদনশীল মানগুলিতে সূক্ষ্ম-দানাযুক্ত অ্যাক্সেস নিয়ন্ত্রণ সরবরাহ করে। আরও তথ্যের জন্য গোপন পরামিতি দেখুন।

আগে: ১ম জেনারেশন

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

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

পরে: 2য় প্রজন্ম

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());
    // ...
  }
);

রানটাইম বিকল্প সেট করুন

রানটাইম বিকল্পগুলির কনফিগারেশন 1st এবং 2nd gen এর মধ্যে পরিবর্তিত হয়েছে৷ 2য় জেন সমস্ত ফাংশনের জন্য বিকল্প সেট করার জন্য একটি নতুন ক্ষমতা যোগ করে।

আগে: ১ম জেনারেশন

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) => {
    // ...
  });

পরে: 2য় প্রজন্ম

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) => {
  /* ... */
});

সঙ্গতি ব্যবহার করুন

2nd gen ফাংশনের একটি উল্লেখযোগ্য সুবিধা হল একটি একক ফাংশন ইন্সট্যান্স একবারে একাধিক অনুরোধ পরিবেশন করার ক্ষমতা। এটি শেষ ব্যবহারকারীদের দ্বারা অনুভব করা ঠান্ডা শুরুর সংখ্যা নাটকীয়ভাবে হ্রাস করতে পারে। ডিফল্টরূপে, সঙ্গতি 80 এ সেট করা হয়, তবে আপনি এটি 1 থেকে 1000 পর্যন্ত যেকোনো মান সেট করতে পারেন:

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

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

টিউনিং কনকারেন্সি কর্মক্ষমতা উন্নত করতে পারে এবং ফাংশনের খরচ কমাতে পারে। একযোগে অনুরোধের অনুমতি দিন -এ একযোগীতা সম্পর্কে আরও জানুন।

বৈশ্বিক পরিবর্তনশীল ব্যবহার নিরীক্ষণ করুন

1st gen ফাংশনগুলি মনের মধ্যে একমত না হয়ে লিখিত গ্লোবাল ভেরিয়েবল ব্যবহার করতে পারে যা প্রতিটি অনুরোধে সেট করা এবং পড়া হয়। যখন কনকারেন্সি সক্ষম করা হয় এবং একটি একক উদাহরণ একসাথে একাধিক অনুরোধ পরিচালনা করা শুরু করে, তখন এটি আপনার ফাংশনে বাগগুলি প্রবর্তন করতে পারে কারণ সমবর্তী অনুরোধগুলি একই সাথে গ্লোবাল ভেরিয়েবল সেট করা এবং পড়া শুরু করে।

আপগ্রেড করার সময়, আপনি আপনার ফাংশনের CPU-কে gcf_gen1 এ সেট করতে পারেন এবং 1ম জেনার আচরণ পুনরুদ্ধার করতে 1-এ concurrency সেট করতে পারেন:

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

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

যাইহোক, এটি একটি দীর্ঘমেয়াদী ফিক্স হিসাবে সুপারিশ করা হয় না, কারণ এটি 2nd gen ফাংশনগুলির কার্যকারিতা সুবিধা হারায়৷ পরিবর্তে, আপনার ফাংশনে গ্লোবাল ভেরিয়েবলের ব্যবহার অডিট করুন এবং আপনি প্রস্তুত হলে এই অস্থায়ী সেটিংসগুলি সরিয়ে দিন।

নতুন ২য় জেনার ফাংশনে ট্রাফিক স্থানান্তর করুন

ঠিক যেমন একটি ফাংশনের অঞ্চল বা ট্রিগার টাইপ পরিবর্তন করার সময়, আপনাকে 2nd gen ফাংশনটিকে একটি নতুন নাম দিতে হবে এবং ধীরে ধীরে এতে ট্র্যাফিক স্থানান্তর করতে হবে।

একই নামের সাথে 1st থেকে 2nd gen এর একটি ফাংশন আপগ্রেড করা এবং firebase deploy চালানো সম্ভব নয়। এটি করার ফলে ত্রুটি হবে:

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

আপনি এই পদক্ষেপগুলি অনুসরণ করার আগে, প্রথমে নিশ্চিত করুন যে আপনার ফাংশন idempotent , যেহেতু পরিবর্তনের সময় আপনার ফাংশনের নতুন সংস্করণ এবং পুরানো সংস্করণ উভয়ই একই সময়ে চলবে৷ উদাহরণ স্বরূপ, আপনার যদি ফায়ারস্টোরে ইভেন্টগুলি লেখার জন্য সাড়া দেয় এমন একটি 1ম জেনার ফাংশন থাকে, তাহলে নিশ্চিত করুন যে একটি লেখার প্রতিক্রিয়া দুইবার, একবার 1ম জেন ফাংশন দ্বারা এবং একবার 2য় জেনার ফাংশন দ্বারা, সেই ইভেন্টগুলির প্রতিক্রিয়া হিসাবে আপনার অ্যাপটি একটি সামঞ্জস্যপূর্ণ রাষ্ট্র।

  1. আপনার ফাংশন কোডে ফাংশনটির নাম পরিবর্তন করুন। উদাহরণস্বরূপ, resizeImage নাম পরিবর্তন করে resizeImageSecondGen করুন।
  2. ফাংশনটি স্থাপন করুন, যাতে মূল 1st gen ফাংশন এবং 2nd gen ফাংশন উভয়ই চলছে৷
    1. কলযোগ্য, টাস্ক কিউ এবং এইচটিটিপি ট্রিগারের ক্ষেত্রে, 2 য় জেন ফাংশনের নাম বা URL সহ ক্লায়েন্ট কোড আপডেট করার মাধ্যমে সমস্ত ক্লায়েন্টকে 2nd gen ফাংশনের দিকে নির্দেশ করা শুরু করুন৷
    2. ব্যাকগ্রাউন্ড ট্রিগারের সাথে, 1st gen এবং 2nd gen উভয় ফাংশনই মোতায়েন করার সাথে সাথে প্রতিটি ইভেন্টে সাড়া দেবে।
  3. সমস্ত ট্র্যাফিক স্থানান্তরিত হয়ে গেলে, ফায়ারবেস সিএলআই-এর firebase functions:delete কমান্ড ব্যবহার করে 1ম জেন ফাংশনটি মুছুন।
    1. ঐচ্ছিকভাবে, 1st gen ফাংশনের নামের সাথে মেলে 2nd gen ফাংশনের নাম পরিবর্তন করুন।