এই নির্দেশিকায় দেওয়া নির্দেশাবলী ব্যবহার করে প্রথম প্রজন্মের ফাংশন ব্যবহারকারী অ্যাপগুলিকে দ্বিতীয় প্রজন্মে স্থানান্তরিত করার কথা বিবেচনা করা উচিত। দ্বিতীয় প্রজন্মের ফাংশনগুলি আরও ভাল কর্মক্ষমতা, আরও ভাল কনফিগারেশন, আরও ভাল পর্যবেক্ষণ এবং আরও অনেক কিছু প্রদানের জন্য ক্লাউড রান ব্যবহার করে।
এই পৃষ্ঠার উদাহরণগুলি ধরে নিচ্ছে যে আপনি CommonJS মডিউল ( require style imports) সহ JavaScript ব্যবহার করছেন, কিন্তু একই নীতি ESM ( import … from style imports) এবং TypeScript সহ JavaScript এর ক্ষেত্রেও প্রযোজ্য।
মাইগ্রেশন প্রক্রিয়া
প্রথম জেনারেশন এবং দ্বিতীয় জেনারেশন ফাংশন একই ফাইলে পাশাপাশি থাকতে পারে। এটি আপনাকে প্রস্তুত থাকাকালীন টুকরো টুকরো করে সহজেই স্থানান্তর করতে সাহায্য করবে। আমরা পরামর্শ দিচ্ছি যে একবারে একটি ফাংশন স্থানান্তর করুন, এগিয়ে যাওয়ার আগে পরীক্ষা এবং যাচাইকরণ করুন।
Firebase CLI এবং firebase-function এর সংস্করণগুলি যাচাই করুন
নিশ্চিত করুন যে আপনি কমপক্ষে Firebase CLI সংস্করণ 12.00 এবং firebase-functions সংস্করণ 4.3.0 ব্যবহার করছেন। যেকোনো নতুন সংস্করণ 2nd gen এবং 1st gen উভয়কেই সমর্থন করবে।
আমদানি আপডেট করুন
firebase-functions SDK-তে v2 সাবপ্যাকেজ থেকে দ্বিতীয় প্রজন্মের ফাংশন আমদানি করা হয়। এই ভিন্ন আমদানি পথটিই ফায়ারবেস CLI-এর জন্য প্রয়োজনীয় যা আপনার ফাংশন কোডকে প্রথম বা দ্বিতীয় প্রজন্মের ফাংশন হিসেবে স্থাপন করবে কিনা তা নির্ধারণ করে।
v2 সাবপ্যাকেজটি মডুলার, এবং আমরা শুধুমাত্র আপনার প্রয়োজনীয় নির্দিষ্ট মডিউলটি আমদানি করার পরামর্শ দিচ্ছি।
আগে: ১ম প্রজন্ম
const functions = require("firebase-functions/v1");
পরে: দ্বিতীয় প্রজন্ম
// 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/v1");
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 মডিউলের সাহায্যে, CLI সমস্ত প্যারামিটারের একটি বৈধ মান না থাকলে স্থাপনা ব্লক করে, নিশ্চিত করে যে কোনও ফাংশন অনুপস্থিত কনফিগারেশন সহ স্থাপন করা হয়নি।
আগে: ১ম প্রজন্ম
const functions = require("firebase-functions/v1");
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());
// ...
}
);
যদি আপনার functions.config সহ পরিবেশগত কনফিগারেশন থাকে, তাহলে আপনার দ্বিতীয় প্রজন্মের আপগ্রেডের অংশ হিসাবে এই কনফিগারেশনটি স্থানান্তর করুন।
functions.config API যেটি বন্ধ করা হয়েছে তা ২০২৭ সালের মার্চ মাসে বন্ধ করে দেওয়া হবে। সেই তারিখের পরে, functions.config ব্যবহার করে ডিপ্লয়মেন্ট করা ব্যর্থ হবে।
স্থাপনার ব্যর্থতা রোধ করতে, Firebase CLI ব্যবহার করে আপনার কনফিগারেশনটি ক্লাউড সিক্রেট ম্যানেজারে স্থানান্তর করুন। এটি আপনার কনফিগারেশন স্থানান্তরের সবচেয়ে কার্যকর এবং নিরাপদ উপায় হিসাবে দৃঢ়ভাবে সুপারিশ করা হয়।
Firebase CLI দিয়ে কনফিগারেশন রপ্তানি করুন
ক্লাউড সিক্রেট ম্যানেজারে আপনার বিদ্যমান পরিবেশ কনফিগারেশনটি একটি নতুন সিক্রেটে রপ্তানি করতে
config exportকমান্ডটি ব্যবহার করুন:$ firebase functions:config:export i This command retrieves your Runtime Config values (accessed via functions.config()) and exports them as a Secret Manager secret. i Fetching your existing functions.config() from your project... ✔ Fetched your existing functions.config(). i Configuration to be exported: ⚠ This may contain sensitive data. Do not share this output. { ... } ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG ✔ Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```গোপন তথ্য আবদ্ধ করতে ফাংশন কোড আপডেট করুন
ক্লাউড সিক্রেট ম্যানেজারে নতুন সিক্রেটে সংরক্ষিত কনফিগারেশন ব্যবহার করতে, আপনার ফাংশন সোর্সে
defineJsonSecretAPI ব্যবহার করুন। এছাড়াও, নিশ্চিত করুন যে সিক্রেটগুলি প্রয়োজনীয় সমস্ত ফাংশনের সাথে আবদ্ধ।আগে
const functions = require("firebase-functions/v1"); exports.myFunction = functions.https.onRequest((req, res) => { const apiKey = functions.config().someapi.key; // ... });পরে
const { onRequest } = require("firebase-functions/v2/https"); const { defineJsonSecret } = require("firebase-functions/params"); const config = defineJsonSecret("RUNTIME_CONFIG"); exports.myFunction = onRequest( // Bind secret to your function { secrets: [config] }, (req, res) => { // Access secret values via .value() const apiKey = config.value().someapi.key; // ... });ফাংশন স্থাপন করুন
পরিবর্তনগুলি প্রয়োগ করতে এবং গোপন অনুমতিগুলি আবদ্ধ করতে আপনার আপডেট করা ফাংশনগুলি স্থাপন করুন।
firebase deploy --only functions:<your-function-name>
রানটাইম বিকল্প সেট করুন
রানটাইম অপশনের কনফিগারেশন ১ম এবং ২য় জেনারেশনের মধ্যে পরিবর্তিত হয়েছে। ২য় জেনারেশন সকল ফাংশনের জন্য অপশন সেট করার জন্য একটি নতুন ক্ষমতা যোগ করে।
আগে: ১ম প্রজন্ম
const functions = require("firebase-functions/v1");
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) => {
/* ... */
});
ডিফল্ট পরিষেবা অ্যাকাউন্ট আপডেট করুন (ঐচ্ছিক)
ফায়ারবেস এপিআই-তে অ্যাক্সেস অনুমোদনের জন্য প্রথম প্রজন্মের ফাংশনগুলি গুগল অ্যাপ ইঞ্জিন ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে, অন্যদিকে দ্বিতীয় প্রজন্মের ফাংশনগুলি কম্পিউট ইঞ্জিন ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে। এই পার্থক্যের ফলে দ্বিতীয় প্রজন্মে স্থানান্তরিত ফাংশনগুলির জন্য অনুমতি সংক্রান্ত সমস্যা দেখা দিতে পারে, যদি আপনি প্রথম প্রজন্মের পরিষেবা অ্যাকাউন্টে বিশেষ অনুমতি প্রদান করেন। যদি আপনি কোনও পরিষেবা অ্যাকাউন্টের অনুমতি পরিবর্তন না করে থাকেন, তাহলে আপনি এই ধাপটি এড়িয়ে যেতে পারেন।
প্রস্তাবিত সমাধান হল, বিদ্যমান ১ম প্রজন্মের অ্যাপ ইঞ্জিন ডিফল্ট সার্ভিস অ্যাকাউন্টটি স্পষ্টভাবে সেই ফাংশনগুলিতে বরাদ্দ করা যা আপনি ২য় প্রজন্মের ডিফল্টকে অগ্রাহ্য করে ২য় প্রজন্মের ডিফল্টে মাইগ্রেট করতে চান। আপনি নিশ্চিত করতে পারেন যে প্রতিটি মাইগ্রেটেড ফাংশন serviceAccountEmail এর জন্য সঠিক মান সেট করে:
const {onRequest} = require("firebase-functions/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions");
// Use the App Engine default service account for all functions
setGlobalOptions({serviceAccountEmail: '<my-project-number>@<wbr>appspot.gserviceaccount.com'});
// Now I use the App Engine default service account.
exports.date = onRequest({cors: true}, (req, res) => {
// ...
});
// I do too!
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) => {
// ...
});
কনকারেন্সি টিউন করলে কর্মক্ষমতা উন্নত হতে পারে এবং ফাংশনের খরচ কমতে পারে। কনকারেন্সি সম্পর্কে আরও জানুন " কনকারেন্সি অনুরোধগুলিকে অনুমতি দিন" বিভাগে।
বিশ্বব্যাপী চলক ব্যবহারের নিরীক্ষা করুন
কনকারেন্সি না ভেবে লেখা প্রথম প্রজন্মের ফাংশনগুলিতে গ্লোবাল ভেরিয়েবল ব্যবহার করা হতে পারে যা প্রতিটি অনুরোধে সেট করা এবং পড়া হয়। যখন কনকারেন্সি সক্ষম করা হয় এবং একটি একক ইনস্ট্যান্স একসাথে একাধিক অনুরোধ পরিচালনা শুরু করে, তখন এটি আপনার ফাংশনে বাগগুলি প্রবর্তন করতে পারে কারণ কনকারেন্সি অনুরোধগুলি একই সাথে গ্লোবাল ভেরিয়েবল সেট করা এবং পড়া শুরু করে।
আপগ্রেড করার সময়, আপনি আপনার ফাংশনের CPU কে 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.
এই ধাপগুলি অনুসরণ করার আগে, প্রথমে নিশ্চিত করুন যে আপনার ফাংশনটি অকার্যকর , কারণ পরিবর্তনের সময় আপনার ফাংশনের নতুন সংস্করণ এবং পুরাতন সংস্করণ উভয়ই একই সময়ে চলবে। উদাহরণস্বরূপ, যদি আপনার ফায়ারস্টোরে একটি 1st gen ফাংশন থাকে যা লেখার ইভেন্টগুলিতে প্রতিক্রিয়া জানায়, তাহলে নিশ্চিত করুন যে লেখার প্রতিক্রিয়া দুবার করা হচ্ছে, একবার 1st gen ফাংশন দ্বারা এবং একবার 2nd gen ফাংশন দ্বারা, সেই ইভেন্টগুলির প্রতিক্রিয়া হিসাবে আপনার অ্যাপটি একটি সামঞ্জস্যপূর্ণ অবস্থায় রয়েছে।
- আপনার ফাংশন কোডে ফাংশনটির নাম পরিবর্তন করুন। উদাহরণস্বরূপ,
resizeImageএর নাম পরিবর্তন করেresizeImageSecondGenকরুন। - ফাংশনটি এমনভাবে স্থাপন করুন যাতে মূল ১ম জেনারেশন ফাংশন এবং ২য় জেনারেশন ফাংশন উভয়ই চলমান থাকে।
- কলেবল, টাস্ক কিউ এবং HTTP ট্রিগারের ক্ষেত্রে, ক্লায়েন্ট কোডটি ২য় জেনার ফাংশনের নাম বা URL দিয়ে আপডেট করে সমস্ত ক্লায়েন্টকে ২য় জেনার ফাংশনের দিকে নির্দেশ করা শুরু করুন।
- ব্যাকগ্রাউন্ড ট্রিগারের সাহায্যে, প্রথম জেনারেশন এবং দ্বিতীয় জেনারেশন উভয় ফাংশনই স্থাপনের সাথে সাথে প্রতিটি ইভেন্টে সাড়া দেবে।
- সমস্ত ট্র্যাফিক মাইগ্রেট করা হয়ে গেলে, firebase CLI এর
firebase functions:deleteকমান্ড ব্যবহার করে প্রথম জেন ফাংশনটি মুছে ফেলুন।- ঐচ্ছিকভাবে, ১ম জেনার ফাংশনের নামের সাথে মিল রেখে ২য় জেনার ফাংশনের নাম পরিবর্তন করুন।