যেসব অ্যাপ প্রথম প্রজন্মের ফাংশন ব্যবহার করছে, তাদের এই গাইডের নির্দেশনা অনুসরণ করে দ্বিতীয় প্রজন্মে স্থানান্তরিত হওয়ার কথা বিবেচনা করা উচিত। দ্বিতীয় প্রজন্মের ফাংশনগুলো উন্নততর পারফরম্যান্স, উন্নত কনফিগারেশন, উন্নত মনিটরিং এবং আরও অনেক কিছু প্রদানের জন্য ক্লাউড রান ব্যবহার করে।
এই ডকুমেন্টের উদাহরণগুলোতে ধরে নেওয়া হয়েছে যে আপনি CommonJS মডিউলসহ জাভাস্ক্রিপ্ট ব্যবহার করছেন ( require style imports), কিন্তু একই নীতিগুলো ESM-সহ জাভাস্ক্রিপ্ট ( import … from style imports) এবং টাইপস্ক্রিপ্টের ক্ষেত্রেও প্রযোজ্য।
অভিবাসন প্রক্রিয়া
প্রথম এবং দ্বিতীয় প্রজন্মের ফাংশনগুলো একই ফাইলে পাশাপাশি থাকতে পারে। এর ফলে আপনি প্রস্তুত হওয়ার সাথে সাথে আপনার কোডবেস ধাপে ধাপে মাইগ্রেট করতে পারবেন। আমরা একবারে একটি করে ফাংশন মাইগ্রেট করার এবং পরবর্তী ধাপে যাওয়ার আগে টেস্টিং ও ভেরিফিকেশন করার পরামর্শ দিই।
Firebase CLI এবং firebase-function এর সংস্করণ যাচাই করুন
নিশ্চিত করুন যে আপনি অন্তত Firebase CLI ভার্সন 12.00 এবং firebase-functions ভার্সন 4.3.0 ব্যবহার করছেন। এর চেয়ে নতুন যেকোনো ভার্সন প্রথম প্রজন্মের পাশাপাশি দ্বিতীয় প্রজন্মকেও সাপোর্ট করবে।
আমদানি আপডেট করুন
২য় প্রজন্মের ফাংশনগুলো firebase-functions SDK-এর v2 সাবপ্যাকেজ থেকে ইম্পোর্ট করা হয়। আপনার ফাংশন কোডটি ১ম নাকি ২য় প্রজন্মের ফাংশন হিসেবে ডেপ্লয় করা হবে, তা নির্ধারণ করার জন্য Firebase 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) => {
/* ... */
});
জাভাস্ক্রিপ্ট ডিস্ট্রাকচারিং-এর মাধ্যমে রিরাইট প্রচেষ্টা হ্রাস করুন।
যদি আপনার ফাংশনগুলোর জটিল কাঠামো থাকে যা প্রথম প্রজন্মের কনটেক্সট বা প্রোভাইডার-নির্দিষ্ট প্যারামিটারের (যেমন message বা snapshot ) উপর ব্যাপকভাবে নির্ভরশীল, তাহলে আপনি দ্বিতীয় প্রজন্মের SDK-তে অন্তর্নির্মিত প্রথম প্রজন্মের কম্প্যাটিবিলিটি হেল্পারগুলো ব্যবহার করতে পারেন।
২য় প্রজন্মের SDK স্বয়ংক্রিয়ভাবে ইভেন্ট অবজেক্টকে ১ম প্রজন্মের সিগনেচারের সাথে মেলে এমন গেটার দিয়ে প্যাচ করে দেয়। এর ফলে আপনি জাভাস্ক্রিপ্ট ডিস্ট্রাকচারিং ব্যবহার করে সরাসরি হ্যান্ডলার সিগনেচার থেকে এই প্রোপার্টিগুলো বের করে আনতে পারেন, যা আপনার ফাংশন লজিক পুনরায় লেখার প্রয়োজনীয়তা কমিয়ে দেয়।
প্রদানকারী ম্যাপিং রেফারেন্স
| সরবরাহকারী | প্রথম প্রজন্মের যুক্তি | দ্বিতীয় প্রজন্মের প্যাচকৃত ইভেন্ট পুনর্গঠন |
| পাব/সাব | (message, context) | ({ message, context }) => { ... } |
| ফায়ারস্টোর | (snapshot, context) | ({ snapshot, context }) => { ... } |
| স্টোরেজ | (object, context) | ({ object, context }) => { ... } |
| রিয়েলটাইম ডেটাবেস | (snapshot, context) | ({ snapshot, context }) => { ... } |
| রিমোট কনফিগারেশন | (version, context) | ({ version, context }) => { ... } |
| সময়সূচী নির্ধারক | (context) | ({ context }) => { ... } |
| টাস্ক কিউ | (data, context) | ({ data, context }) => { ... } |
পূর্বে (১ম প্রজন্ম):
export const myPubSubV1 = functions.pubsub.topic("my-topic").onPublish((message, context) => {
const data = message.json;
const eventId = context.eventId;
// ... rest of the logic
});
নতুন বিকল্প (বিগঠন সহ দ্বিতীয় প্রজন্ম):
import { onMessagePublished } from "firebase-functions/v2/pubsub";
export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
// No need to change the function body!
const data = message.json; // Uses v1 Message wrapper
const eventId = context.eventId; // Uses v1 EventContext map
// ... rest of the logic
});
প্যারামিটারযুক্ত কনফিগারেশন ব্যবহার করুন
দ্বিতীয় প্রজন্মের ফাংশনগুলো 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 ব্যবহার করে আপনার কনফিগারেশন Cloud Secret Manager-এ মাইগ্রেট করুন। আপনার কনফিগারেশন মাইগ্রেট করার সবচেয়ে কার্যকর এবং নিরাপদ উপায় হিসেবে এটি জোরালোভাবে সুপারিশ করা হয়।
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) => {
// ...
});
বিকল্পভাবে, আপনি অ্যাপ ইঞ্জিন ডিফল্ট সার্ভিস অ্যাকাউন্ট (১ম জেনারেশনের জন্য) এবং কম্পিউট ইঞ্জিন ডিফল্ট সার্ভিস অ্যাকাউন্ট (২য় জেনারেশনের জন্য) উভয়েরই প্রয়োজনীয় সমস্ত অনুমতির সাথে মিলিয়ে সার্ভিস অ্যাকাউন্টের বিবরণ পরিবর্তন করে নিতে পারেন।
কনকারেন্সি ব্যবহার করুন
দ্বিতীয় প্রজন্মের ফাংশনগুলোর একটি উল্লেখযোগ্য সুবিধা হলো, একটিমাত্র ফাংশন ইনস্ট্যান্স একই সাথে একাধিক অনুরোধ সম্পাদন করতে পারে। এর ফলে ব্যবহারকারীদের সম্মুখীন হওয়া কোল্ড স্টার্টের সংখ্যা ব্যাপকভাবে কমে যেতে পারে। ডিফল্টরূপে, কনকারেন্সি ৮০-তে সেট করা থাকে, কিন্তু আপনি এটিকে ১ থেকে ১০০০-এর মধ্যে যেকোনো মানে সেট করতে পারেন।
const {onRequest} = require("firebase-functions/v2/https");
exports.date = onRequest({
// set concurrency value
concurrency: 500
},
(req, res) => {
// ...
});
কনকারেন্সি টিউনিং ফাংশনের পারফরম্যান্স উন্নত করতে এবং খরচ কমাতে পারে। ‘Allow concurrent requests’- এ কনকারেন্সি সম্পর্কে আরও জানুন।
গ্লোবাল ভেরিয়েবলের ব্যবহার নিরীক্ষা করুন
কনকারেন্সি মাথায় না রেখে লেখা প্রথম প্রজন্মের ফাংশনগুলোতে এমন গ্লোবাল ভেরিয়েবল ব্যবহৃত হতে পারে, যা প্রতিটি রিকোয়েস্টের সাথে সেট ও রিড করা হয়। যখন কনকারেন্সি চালু করা হয় এবং একটিমাত্র ইনস্ট্যান্স একসাথে একাধিক রিকোয়েস্ট হ্যান্ডেল করতে শুরু করে, তখন এটি আপনার ফাংশনে বাগ তৈরি করতে পারে, কারণ কনকারেন্ট রিকোয়েস্টগুলো একই সাথে গ্লোবাল ভেরিয়েবল সেট ও রিড করতে থাকে।
আপগ্রেড করার সময়, প্রথম প্রজন্মের আচরণ পুনরুদ্ধার করতে আপনি আপনার ফাংশনের 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.
মাইগ্রেশন কৌশলটি আপনার ফাংশনটি যে ধরনের ট্রিগার ব্যবহার করে তার উপর নির্ভর করে।
কলযোগ্য, টাস্ক কিউ এবং HTTP ট্রিগারের জন্য
এই ট্রিগারগুলো সরাসরি আহ্বান করে। যেহেতু দ্বিতীয় প্রজন্মের ফাংশনটির একটি নতুন নাম (এবং HTTP ট্রিগারগুলোর জন্য একটি নতুন URL) থাকবে, তাই আপনি ক্লায়েন্টগুলো আপডেট করার মাধ্যমে ট্র্যাফিক স্থানান্তর করতে পারবেন।
- আপনার কোডে ফাংশনটির নাম পরিবর্তন করুন (যেমন,
myCallableকেmyCallableV2তে পরিবর্তন করুন)। - ফাংশনটি স্থাপন করুন। প্রথম প্রজন্ম এবং দ্বিতীয় প্রজন্ম উভয় ফাংশনই এখন চালু আছে।
- আপনার ক্লায়েন্ট কোড বা কলারকে নতুন দ্বিতীয় প্রজন্মের ফাংশনের নাম বা URL নির্দেশ করার জন্য আপডেট করুন।
- সমস্ত ট্র্যাফিক নতুন ফাংশনে স্থানান্তরিত হয়ে গেলে, Firebase CLI-এর
firebase functions:deleteকমান্ড ব্যবহার করে প্রথম প্রজন্মের ফাংশনটি মুছে ফেলুন।
ব্যাকগ্রাউন্ড ট্রিগারের জন্য ( Pub/Sub , Cloud Firestore , Cloud Storage , ইত্যাদি)
ব্যাকগ্রাউন্ড ট্রিগারগুলো আপনার প্রোজেক্টের ইভেন্টগুলোতে সাড়া দেয়। ট্রানজিশনের সময় কোনো ইভেন্ট যাতে বাদ না পড়ে, সেজন্য আপনাকে সাময়িকভাবে প্রথম জেনারেশন এবং দ্বিতীয় জেনারেশন উভয় ফাংশন পাশাপাশি চালাতে হবে।
রূপান্তরকালীন সময়ে, উভয় ফাংশনই একই ইভেন্টে ট্রিগার হবে। এর মানে হলো, আপনার বিজনেস লজিক প্রতিটি ইভেন্টের জন্য দুইবার করে চলবে। কাজ শুরু করার আগে নিশ্চিত করুন যে আপনার ফাংশনটি আইডম্পোটেন্ট ।
ধাপ ১: প্রথম প্রজন্মের ফাংশনের পাশাপাশি দ্বিতীয় প্রজন্মের ফাংশনটিও যুক্ত করুন।
আপনার কোডে বিদ্যমান প্রথম প্রজন্মের ফাংশনটি রাখুন এবং একই ইভেন্ট সোর্স থেকে তথ্য শোনার জন্য দ্বিতীয় প্রজন্মের ফাংশনটি যোগ করুন।
বিশেষ পরামর্শ: যাচাইকরণের জন্য পাসথ্রু ব্যবহার করুন। ট্রানজিশনের সময় আপনার কোডবেসে বিজনেস লজিকের পুনরাবৃত্তি এড়াতে, অথবা দ্বিতীয় প্রজন্মের ফাংশনটিকে পুরোপুরি বিশ্বাস করার আগে সেটি সঠিকভাবে ইভেন্ট গ্রহণ করছে কিনা তা যাচাই করতে, দ্বিতীয় প্রজন্মের ফাংশনটিকে একটি পাসথ্রু হিসেবে তৈরি করুন যা run মেথড ব্যবহার করে প্রথম প্রজন্মের ফাংশনটিকে কল করে।
import * as functions from "firebase-functions/v1";
import { onMessagePublished } from "firebase-functions/v2/pubsub";
// --- Existing 1st gen function ---
export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => {
console.log("V1 handler running for event:", context.eventId);
// ... existing v1 function logic ...
});
// --- New v2 passthrough function ---
export const myPubSubV2 = onMessagePublished("my-topic", async ({ message, context }) => {
console.log("v2 handler triggering V1 for event:", context.eventId);
// Call the v1 function's handler
await myPubSub.run(message, context);
});
ধাপ ২: উভয় ফাংশন স্থাপন করুন
firebase deploy চালান। এখন উভয় ফাংশনই সক্রিয় এবং একই ইভেন্টগুলো শুনছে।
ধাপ ৩: যাচাই করুন যে দ্বিতীয় প্রজন্মের ফাংশনটি ট্র্যাফিক পাচ্ছে।
উভয় ফাংশনের লগ পর্যবেক্ষণ করুন। নিশ্চিত করুন যে সমস্ত ইভেন্টের জন্য দ্বিতীয় প্রজন্মের ফাংশনটি কল করা হচ্ছে এবং কলগুলো সফল হচ্ছে।
ধাপ ৪: সম্পূর্ণ লজিকটি ২য় প্রজন্মের ফাংশনে স্থানান্তর করুন
একবার নিশ্চিত হলে, আসল বিজনেস লজিকটি প্রথম প্রজন্মের ফাংশন থেকে দ্বিতীয় প্রজন্মের ফাংশনের বডিতে সরিয়ে নিন। যদি আপনি পাসথ্রু মেথড ব্যবহার করে থাকেন, তাহলে myPubSub.run() কলটি সরিয়ে দিন।
import * as functions from "firebase-functions/v1";
import { onMessagePublished } from "firebase-functions/v2/pubsub";
// --- Existing v1 function (to be removed next) ---
export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => {
console.log("v1 handler running for event:", context.eventId);
// ... existing v1 function logic ...
});
// --- New v2 function with full logic ---
export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
console.log("v2 handler running for event:", context.eventId);
// ... existing v1 function logic WAS MOVED HERE ...
});
এই পরিবর্তনটি প্রয়োগ করুন।
ধাপ ৫: প্রথম প্রজন্মের ফাংশনটি আনডিপ্লয় করুন
আপনার কোড থেকে 1st gen ফাংশন ডেফিনিশনটি সরিয়ে ফেলুন এবং পুনরায় ডিপ্লয় করুন। CLI আপনাকে গুগল ক্লাউড থেকে 1st gen ফাংশনটি ডিলিট করার জন্য প্রম্পট করবে।
import { onMessagePublished } from "firebase-functions/v2/pubsub";
// --- V1 function definition REMOVED ---
// --- New v2 function with full logic ---
export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
console.log("v2 handler running for event:", context.eventId);
// ... existing v1 function logic ...
});