আপনি Firebase CLI কমান্ড ব্যবহার করে অথবা আপনার ফাংশনের সোর্স কোডে রানটাইম অপশন সেট করার মাধ্যমে ফাংশন স্থাপন, মুছে ফেলা এবং পরিবর্তন করতে পারেন।
ফাংশন স্থাপন করুন
ফাংশনগুলো ডিপ্লয় করতে, এই Firebase CLI কমান্ডটি চালান:
firebase deploy --only functions
ডিফল্টরূপে, Firebase CLI আপনার সোর্সের ভেতরের সমস্ত ফাংশন একই সাথে ডিপ্লয় করে। যদি আপনার প্রজেক্টে ৫টির বেশি ফাংশন থাকে, তাহলে আমরা আপনাকে নির্দিষ্ট ফাংশনের নামসহ --only ফ্ল্যাগটি ব্যবহার করার পরামর্শ দিই, যাতে শুধুমাত্র আপনার এডিট করা ফাংশনগুলোই ডিপ্লয় করা যায়। এভাবে নির্দিষ্ট ফাংশন ডিপ্লয় করলে ডিপ্লয়মেন্ট প্রক্রিয়া দ্রুত হয় এবং আপনাকে ডিপ্লয়মেন্ট কোটার সম্মুখীন হওয়া থেকে বাঁচায়। উদাহরণস্বরূপ:
firebase deploy --only functions:addMessage,functions:makeUppercase
বিপুল সংখ্যক ফাংশন ডেপ্লয় করার সময়, আপনি স্ট্যান্ডার্ড কোটা অতিক্রম করতে পারেন এবং HTTP 429 বা 500 এরর মেসেজ পেতে পারেন। এর সমাধান করতে, ফাংশনগুলোকে ১০টি বা তার কমের গ্রুপে ডেপ্লয় করুন।
উপলব্ধ কমান্ডগুলোর সম্পূর্ণ তালিকার জন্য Firebase সিএলআই রেফারেন্স দেখুন।
ডিফল্টরূপে, Firebase CLI সোর্স কোডের জন্য functions/ ফোল্ডারে অনুসন্ধান করে। আপনি চাইলে ফাংশনগুলোকে কোডবেস বা একাধিক ফাইল সেটে সাজাতে পারেন।
ডেপ্লয়মেন্ট আর্টিফ্যাক্টগুলি পরিষ্কার করুন
ফাংশন ডেপ্লয়মেন্টের অংশ হিসেবে, কন্টেইনার ইমেজ তৈরি করা হয় এবং Artifact Registry -তে সংরক্ষণ করা হয়। আপনার ডেপ্লয় করা ফাংশনগুলো চালানোর জন্য এই ইমেজগুলোর প্রয়োজন হয় না; Cloud Functions প্রাথমিক ডেপ্লয়মেন্টের সময় ইমেজটির একটি কপি সংগ্রহ করে ও সংরক্ষণ করে, কিন্তু রানটাইমে ফাংশনটি কাজ করার জন্য সংরক্ষিত আর্টিফ্যাক্টগুলো অপরিহার্য নয়।
যদিও এই কন্টেইনার ইমেজগুলো প্রায়শই আকারে ছোট হয়, সময়ের সাথে সাথে এগুলো জমা হতে পারে এবং আপনার স্টোরেজ খরচ বাড়িয়ে তুলতে পারে। আপনি যদি বিল্ড করা আর্টিফ্যাক্টগুলো পরীক্ষা করার বা কন্টেইনারের দুর্বলতা স্ক্যান চালানোর পরিকল্পনা করেন, তবে কিছু সময়ের জন্য এগুলো সংরক্ষণ করা আপনার জন্য সুবিধাজনক হতে পারে।
স্টোরেজ খরচ পরিচালনায় সাহায্য করার জন্য, Firebase CLI 14.0.0 এবং এর পরবর্তী সংস্করণগুলো আপনাকে প্রতিটি ফাংশন ডিপ্লয়মেন্টের পর ডিপ্লয়মেন্ট আর্টিফ্যাক্ট সংরক্ষণকারী রিপোজিটরিগুলোর জন্য একটি Artifact Registry ক্লিনআপ পলিসি কনফিগার করার সুযোগ দেয়।
আপনি functions:artifacts:setpolicy কমান্ডটি ব্যবহার করে ম্যানুয়ালি একটি ক্লিনআপ পলিসি সেট আপ বা সম্পাদনা করতে পারেন:
firebase functions:artifacts:setpolicy
ডিফল্টরূপে, এই কমান্ডটি Artifact Registry ১ দিনের বেশি পুরোনো কন্টেইনার ইমেজগুলো স্বয়ংক্রিয়ভাবে মুছে ফেলার জন্য কনফিগার করে। এটি স্টোরেজ খরচ কমানো এবং সাম্প্রতিক বিল্ডগুলো সম্ভাব্য পর্যালোচনার সুযোগ দেওয়ার মধ্যে একটি যুক্তিসঙ্গত ভারসাম্য প্রদান করে।
আপনি --days অপশনটি ব্যবহার করে সংরক্ষণের সময়কাল কাস্টমাইজ করতে পারেন:
firebase functions:artifacts:setpolicy --days 7 # Delete images older than 7 days
আপনি যদি একাধিক অঞ্চলে ফাংশন স্থাপন করেন, তাহলে --location বিকল্পটি ব্যবহার করে একটি নির্দিষ্ট অবস্থানের জন্য একটি পরিষ্করণ নীতি সেট আপ করতে পারেন:
$ firebase functions:artifacts:setpolicy --location europe-west1
আর্টিফ্যাক্ট ক্লিনআপ থেকে অপ্ট আউট করুন
যদি আপনি ম্যানুয়ালি ইমেজ ক্লিনআপ পরিচালনা করতে পছন্দ করেন, অথবা যদি আপনি কোনো ইমেজ ডিলিট করতে না চান, তাহলে আপনি ক্লিনআপ পলিসিগুলো থেকে সম্পূর্ণরূপে অপ্ট আউট করতে পারেন:
$ firebase functions:artifacts:setpolicy --none
এই কমান্ডটি Firebase CLI দ্বারা সেট করা যেকোনো বিদ্যমান ক্লিনআপ পলিসি মুছে ফেলে এবং ফাংশন ডিপ্লয়মেন্টের পরে Firebase-কে কোনো ক্লিনআপ পলিসি সেট করা থেকে বিরত রাখে।
মুছে ফেলার ফাংশন
আপনি পূর্বে স্থাপন করা ফাংশনগুলি নিম্নলিখিত উপায়ে মুছে ফেলতে পারেন:
- Firebase CLI-তে
functions:deleteব্যবহার করে স্পষ্টভাবে - Google Cloud কনসোলে স্পষ্টভাবে ।
- ডেপ্লয়মেন্টের আগে সোর্স থেকে ফাংশনটি সরিয়ে ফেলার মাধ্যমে পরোক্ষভাবে ।
প্রোডাকশন থেকে ফাংশনটি সরানোর আগে, সমস্ত ডিলিট অপারেশনের জন্য আপনাকে নিশ্চিত করতে বলা হবে।
Firebase CLI-তে সুস্পষ্টভাবে ফাংশন মুছে ফেলার ক্ষেত্রে একাধিক আর্গুমেন্ট ও ফাংশন গ্রুপ সমর্থন করে এবং এটি আপনাকে একটি নির্দিষ্ট অঞ্চলে চলমান ফাংশন উল্লেখ করার সুযোগ দেয়। এছাড়াও, আপনি কনফার্মেশন প্রম্পটটি ওভাররাইড করতে পারেন।
সমস্ত অঞ্চলে নির্দিষ্ট নামের সাথে মেলে এমন সমস্ত ফাংশন মুছে দেয়:
firebase functions:delete FUNCTION-1_NAME
ডিফল্ট নয় এমন অঞ্চলে চলমান একটি নির্দিষ্ট ফাংশন মুছে ফেলে:
firebase functions:delete FUNCTION-1_NAME --region REGION_NAME
একাধিক ফাংশন মুছে ফেলে:
firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME
একটি নির্দিষ্ট ফাংশন গ্রুপ মুছে ফেলে:
firebase functions:delete GROUP_NAME
নিশ্চিতকরণ প্রম্পটটি এড়িয়ে যায়:
firebase functions:delete FUNCTION-1_NAME --force
ইমপ্লিসিট ফাংশন ডিলিশন চালু থাকলে, firebase deploy আপনার সোর্স কোড পার্স করে এবং ফাইল থেকে মুছে ফেলা যেকোনো ফাংশনকে প্রোডাকশন থেকে সরিয়ে দেয়।
একটি ফাংশনের নাম, অঞ্চল বা ট্রিগার পরিবর্তন করুন
আপনি যদি প্রোডাকশন ট্র্যাফিক পরিচালনা করে এমন ফাংশনগুলির অঞ্চল বা ট্রিগারের নাম পরিবর্তন করেন, তাহলে পরিবর্তনের সময় ইভেন্ট হারিয়ে যাওয়া এড়াতে এই বিভাগের ধাপগুলি অনুসরণ করুন। এই ধাপগুলি অনুসরণ করার আগে, প্রথমে নিশ্চিত করুন যে আপনার ফাংশনটি আইডম্পোটেন্ট (idempotent ), কারণ পরিবর্তনের সময় আপনার ফাংশনের নতুন এবং পুরানো উভয় সংস্করণই একই সাথে চালু থাকবে।
একটি ফাংশনের নাম পরিবর্তন করুন
একটি ফাংশনের নাম পরিবর্তন করতে, আপনার সোর্সে ফাংশনটির একটি নতুন নামযুক্ত সংস্করণ তৈরি করুন এবং তারপর দুটি পৃথক ডেপ্লয়মেন্ট কমান্ড চালান। প্রথম কমান্ডটি নতুন নামযুক্ত ফাংশনটি ডেপ্লয় করে, এবং দ্বিতীয় কমান্ডটি পূর্বে ডেপ্লয় করা সংস্করণটি সরিয়ে দেয়। উদাহরণস্বরূপ, যদি আপনার একটি HTTP-ট্রিগারড ওয়েবহুক থাকে যার নাম আপনি পরিবর্তন করতে চান, তাহলে কোডটি নিম্নরূপভাবে সংশোধন করুন:
নোড.জেএস
// before
const {onRequest} = require('firebase-functions/v2/https');
exports.webhook = onRequest((req, res) => {
res.send("Hello");
});
// after
const {onRequest} = require('firebase-functions/v2/https');
exports.webhookNew = onRequest((req, res) => {
res.send("Hello");
});
পাইথন
# before
from firebase_functions import https_fn
@https_fn.on_request()
def webhook(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello world!")
# after
from firebase_functions import https_fn
@https_fn.on_request()
def webhook_new(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello world!")
এরপর নতুন ফাংশনটি ডিপ্লয় করতে নিম্নলিখিত কমান্ডগুলো চালান:
# Deploy new function firebase deploy --only functions:webhookNew # Wait until deployment is done; now both functions are running # Delete webhook firebase functions:delete webhook
একটি ফাংশনের অঞ্চল বা অঞ্চলসমূহ পরিবর্তন করুন
আপনি যদি প্রোডাকশন ট্র্যাফিক পরিচালনা করে এমন কোনো ফাংশনের জন্য নির্দিষ্ট অঞ্চলগুলি পরিবর্তন করেন, তাহলে ক্রমানুসারে এই পদক্ষেপগুলি সম্পাদন করে ইভেন্ট লস প্রতিরোধ করতে পারেন:
- ফাংশনটির নাম পরিবর্তন করুন এবং প্রয়োজন অনুযায়ী এর অঞ্চল বা অঞ্চলগুলো পরিবর্তন করুন।
- পুনঃনামকৃত ফাংশনটি ডিপ্লয় করুন, যার ফলে উভয় অঞ্চলের সেটেই সাময়িকভাবে একই কোড রান হবে।
- পূর্ববর্তী ফাংশনটি মুছে ফেলুন।
উদাহরণস্বরূপ, যদি আপনার একটি Cloud Firestore -চালিত ফাংশন থাকে যা বর্তমানে us-central1 এর ডিফল্ট ফাংশন অঞ্চলে রয়েছে এবং আপনি এটিকে asia-northeast1 এ স্থানান্তর করতে চান, তাহলে আপনাকে প্রথমে ফাংশনটির নাম পরিবর্তন করতে এবং অঞ্চলটি সংশোধন করতে আপনার সোর্স কোড পরিবর্তন করতে হবে।
নোড.জেএস
// before
exports.firestoreTrigger = onDocumentCreated(
"my-collection/{docId}",
(event) => {},
);
// after
exports.firestoreTriggerAsia = onDocumentCreated(
{
document: "my-collection/{docId}",
region: "asia-northeast1",
},
(event) => {},
);
আপডেট করা কোডে অঞ্চলের সাথে সঠিক ইভেন্ট ফিল্টার (এই ক্ষেত্রে document ) উল্লেখ করতে হবে। আরও তথ্যের জন্য Cloud Functions লোকেশন দেখুন।
পাইথন
# Before
@firestore_fn.on_document_created("my-collection/{docId}")
def firestore_trigger(event):
pass
# After
@firestore_fn.on_document_created("my-collection/{docId}",
region="asia-northeast1")
def firestore_trigger_asia(event):
pass
তারপর এটি চালিয়ে স্থাপন করুন:
firebase deploy --only functions:firestoreTriggerAsia
এখন দুটি অভিন্ন ফাংশন চালু আছে: firestoreTrigger চলছে us-central1 এ, এবং firestoreTriggerAsia চলছে asia-northeast1 এ।
তারপর, firestoreTrigger মুছে ফেলুন:
firebase functions:delete firestoreTrigger
এখন কেবল একটিই ফাংশন আছে - firestoreTriggerAsia , যেটি asia-northeast1 এ চলছে।
একটি ফাংশনের ট্রিগার টাইপ পরিবর্তন করুন
সময়ের সাথে সাথে আপনি যখন আপনার Cloud Functions for Firebase ডেপ্লয়মেন্ট উন্নত করবেন, তখন বিভিন্ন কারণে আপনার একটি ফাংশনের ট্রিগার টাইপ পরিবর্তন করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, আপনি এক ধরনের Firebase Realtime Database বা Cloud Firestore ইভেন্ট থেকে অন্য ধরনের ইভেন্টে পরিবর্তন করতে চাইতে পারেন।
শুধুমাত্র সোর্স কোড পরিবর্তন করে এবং firebase deploy চালিয়ে কোনো ফাংশনের ইভেন্ট টাইপ পরিবর্তন করা সম্ভব নয়। ত্রুটি এড়াতে, এই পদ্ধতি অনুসরণ করে একটি ফাংশনের ট্রিগার টাইপ পরিবর্তন করুন:
- কাঙ্ক্ষিত ট্রিগার টাইপসহ একটি নতুন ফাংশন অন্তর্ভুক্ত করতে সোর্স কোডটি পরিবর্তন করুন।
- ফাংশনটি ডিপ্লয় করুন, যার ফলে পুরোনো এবং নতুন উভয় ফাংশনই সাময়িকভাবে চালু হবে।
- Firebase CLI ব্যবহার করে প্রোডাকশন থেকে পুরোনো ফাংশনটি সুস্পষ্টভাবে মুছে ফেলুন।
উদাহরণস্বরূপ, যদি আপনার এমন একটি ফাংশন থাকে যা কোনো অবজেক্ট ডিলিট হলে ট্রিগার হতো, কিন্তু পরে আপনি অবজেক্ট ভার্সনিং চালু করেন এবং এর পরিবর্তে আর্কাইভ ইভেন্টে সাবস্ক্রাইব করতে চান, তাহলে প্রথমে ফাংশনটির নাম পরিবর্তন করুন এবং নতুন ট্রিগার টাইপটি যোগ করার জন্য এটি সম্পাদনা করুন।
নোড.জেএস
// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");
exports.objectDeleted = onObjectDeleted((event) => {
// ...
});
// after
const {onObjectArchived} = require("firebase-functions/v2/storage");
exports.objectArchived = onObjectArchived((event) => {
// ...
});
পাইথন
# before
from firebase_functions import storage_fn
@storage_fn.on_object_deleted()
def object_deleted(event):
# ...
# after
from firebase_functions import storage_fn
@storage_fn.on_object_archived()
def object_archived(event):
# ...
তারপর পুরানো ফাংশনটি মুছে ফেলার আগে, নতুন ফাংশনটি তৈরি করতে নিম্নলিখিত কমান্ডগুলি চালান:
# Create new function objectArchived firebase deploy --only functions:objectArchived # Wait until deployment is done; now both objectDeleted and objectArchived are running # Delete objectDeleted firebase functions:delete objectDeleted
রানটাইম বিকল্পগুলি সেট করুন
Cloud Functions for Firebase আপনাকে Node.js রানটাইম ভার্সন, প্রতিটি ফাংশনের জন্য টাইমআউট, মেমরি বরাদ্দ এবং সর্বনিম্ন/সর্বোচ্চ ফাংশন ইনস্ট্যান্সের মতো রানটাইম অপশনগুলো নির্বাচন করার সুযোগ দেয়।
একটি উত্তম অনুশীলন হিসেবে, এই অপশনগুলো (Node.js সংস্করণ ছাড়া) ফাংশন কোডের ভেতরে একটি কনফিগারেশন অবজেক্টে সেট করা উচিত। এই RuntimeOptions অবজেক্টটিই আপনার ফাংশনের রানটাইম অপশনগুলোর মূল উৎস, এবং এটি অন্য যেকোনো পদ্ধতিতে (যেমন Google Cloud কনসোল বা gcloud CLI-এর মাধ্যমে) সেট করা অপশনগুলোকে ওভাররাইড করবে।
যদি আপনার ডেভেলপমেন্ট ওয়ার্কফ্লোতে গুগল ক্লাউড কনসোল বা gcloud CLI-এর মাধ্যমে ম্যানুয়ালি রানটাইম অপশন সেট করা অন্তর্ভুক্ত থাকে এবং আপনি না চান যে প্রতিটি ডিপ্লয়ের সময় এই মানগুলি ওভাররাইড হয়ে যাক, তাহলে preserveExternalChanges অপশনটি true তে সেট করুন। এই অপশনটি true তে সেট করা থাকলে, Firebase আপনার কোডে সেট করা রানটাইম অপশনগুলিকে আপনার ফাংশনের বর্তমানে-ডিপ্লয় করা সংস্করণের সেটিংসের সাথে নিম্নলিখিত অগ্রাধিকার অনুসারে মার্জ করে:
- ফাংশন কোডে একটি অপশন সেট করা আছে: বাহ্যিক পরিবর্তনসমূহকে অগ্রাহ্য করা।
- ফাংশন কোডে অপশনটি
RESET_VALUEতে সেট করা আছে: বাহ্যিক পরিবর্তনগুলোকে ডিফল্ট মান দিয়ে ওভাররাইড করার জন্য। - ফাংশন কোডে অপশনটি সেট করা নেই, কিন্তু বর্তমানে ডেপ্লয় করা ফাংশনে সেট করা আছে: ডেপ্লয় করা ফাংশনে নির্দিষ্ট করা অপশনটি ব্যবহার করুন।
বেশিরভাগ ক্ষেত্রে preserveExternalChanges: true অপশনটি ব্যবহার করার পরামর্শ দেওয়া হয় না , কারণ সেক্ষেত্রে আপনার ফাংশনগুলোর রানটাইম অপশনের জন্য আপনার কোড আর তথ্যের সম্পূর্ণ উৎস থাকবে না। যদি আপনি এটি ব্যবহার করেন, তবে কোনো ফাংশনের সম্পূর্ণ কনফিগারেশন দেখতে Google Cloud কনসোল অথবা gcloud CLI ব্যবহার করুন।
Node.js সংস্করণ সেট করুন
ক্লাউড ফাংশনের জন্য Firebase এসডিকে (Firebase SDK for Cloud Functions ) একাধিক নোড.জেএস (Node.js) রানটাইম বেছে নেওয়ার সুযোগ দেয়। আপনি একটি প্রোজেক্টের সমস্ত ফাংশন শুধুমাত্র এই সমর্থিত নোড.জেএস সংস্করণগুলির মধ্যে যেকোনো একটির সাথে সঙ্গতিপূর্ণ রানটাইম এনভায়রনমেন্টে চালানোর জন্য নির্বাচন করতে পারেন:
- Node.js 22
- নোড.জেএস ২০
- নোড.জেএস ১৮ (অপ্রচলিত)
২০২৫ সালের শুরুর দিকে Node.js ভার্সন ১৪ এবং ১৬-এর ব্যবহার বন্ধ করে দেওয়া হয়েছে। এই ভার্সনগুলোর সাথে ডেপ্লয়মেন্ট নিষ্ক্রিয় করা হয়েছে। Node.js-এর এই ভার্সনগুলোর চলমান সাপোর্ট সংক্রান্ত গুরুত্বপূর্ণ তথ্যের জন্য সাপোর্ট শিডিউল দেখুন।
Node.js সংস্করণ সেট করতে:
ইনিশিয়ালাইজেশনের সময় আপনার functions/ ডিরেক্টরিতে তৈরি হওয়া package.json ফাইলের engines ফিল্ডে আপনি ভার্সনটি সেট করতে পারেন। উদাহরণস্বরূপ, শুধুমাত্র ভার্সন ২০ ব্যবহার করতে, package.json এর এই লাইনটি এডিট করুন:
"engines": {"node": "20"}
যদি আপনি ইয়ার্ন (Yarn) প্যাকেজ ম্যানেজার ব্যবহার করেন অথবা engines ফিল্ডের জন্য আপনার অন্য কোনো নির্দিষ্ট প্রয়োজনীয়তা থাকে, তাহলে আপনি এর পরিবর্তে firebase.json এ Cloud Functions জন্য Firebase SDK for Cloud Functions)-এর রানটাইম সেট করতে পারেন:
{
"functions": {
"runtime": "nodejs20" // or nodejs22
}
}
package.json এ আপনি আলাদাভাবে সেট করা যেকোনো মান বা পরিসরের চেয়ে firebase.json এ সেট করা মানটিকেই CLI অগ্রাধিকার দেয়।
আপনার Node.js রানটাইম আপগ্রেড করুন
আপনার Node.js রানটাইম আপগ্রেড করতে:
- আপনার প্রজেক্টটি ব্লেজ প্রাইসিং প্ল্যানের অন্তর্ভুক্ত আছে কিনা, তা নিশ্চিত করুন।
- নিশ্চিত করুন যে আপনি Firebase CLI v11.18.0 বা তার পরবর্তী সংস্করণ ব্যবহার করছেন।
- ইনিশিয়ালাইজেশনের সময় আপনার
functions/ডিরেক্টরিতে তৈরি হওয়াpackage.jsonফাইলেরenginesভ্যালুটি পরিবর্তন করুন। উদাহরণস্বরূপ, আপনি যদি ভার্সন ১৮ থেকে ভার্সন ২০-তে আপগ্রেড করেন, তাহলে এন্ট্রিটি দেখতে এইরকম হবে:"engines": {"node": "20"} - ঐচ্ছিকভাবে, Firebase Local Emulator Suite ব্যবহার করে আপনার পরিবর্তনগুলি পরীক্ষা করে দেখুন।
- সমস্ত ফাংশন পুনরায় স্থাপন করুন।
একটি Node.js মডিউল সিস্টেম বেছে নিন
Node.js-এর ডিফল্ট মডিউল সিস্টেম হলো CommonJS (CJS), কিন্তু Node.js-এর বর্তমান সংস্করণগুলো ECMAScript মডিউল (ESM)-কেও সমর্থন করে। Cloud Functions উভয়কেই সমর্থন করে।
ডিফল্টরূপে, আপনার ফাংশনগুলো CommonJS ব্যবহার করে। তার মানে ইম্পোর্ট এবং এক্সপোর্টগুলো দেখতে এইরকম:
const {onRequest} = require("firebase-functions/https");
exports.helloWorld = onRequest(async (req, res) => res.send("Hello from Firebase!"));
এর পরিবর্তে ESM ব্যবহার করতে, আপনার package.json ফাইলে "type": "module" ফিল্ডটি সেট করুন:
{
...
"type": "module",
...
}
একবার এটি সেট করে নিলে, ESM import এবং export সিনট্যাক্স ব্যবহার করুন:
import {onRequest} from "firebase-functions/https";
export const helloWorld = onRequest(async (req, res) => res.send("Hello from Firebase!"));
উভয় মডিউল সিস্টেমই সম্পূর্ণরূপে সমর্থিত। আপনি আপনার প্রোজেক্টের জন্য সবচেয়ে উপযুক্তটি বেছে নিতে পারেন। মডিউল সম্পর্কে আরও জানতে Node.js ডকুমেন্টেশন দেখুন।
পাইথন সংস্করণ সেট করুন
Firebase SDK for Cloud Functions ভার্সন 12.0.0 এবং তার পরবর্তী ভার্সনগুলোতে পাইথন রানটাইম নির্বাচন করার সুযোগ রয়েছে। firebase.json ফাইলে রানটাইম ভার্সনটি নিম্নরূপে সেট করুন:
{
"functions": {
"runtime": "python310" // or python311
}
}
স্কেলিং আচরণ নিয়ন্ত্রণ করুন
ডিফল্টরূপে, Cloud Functions for Firebase আগত অনুরোধের সংখ্যার উপর ভিত্তি করে চলমান ইনস্ট্যান্সের সংখ্যা পরিবর্তন করে, এবং ট্র্যাফিক কমে গেলে ইনস্ট্যান্সের সংখ্যা শূন্য পর্যন্ত কমিয়ে আনতে পারে। তবে, যদি আপনার অ্যাপের ল্যাটেন্সি কমানোর প্রয়োজন হয় এবং আপনি কোল্ড স্টার্টের সংখ্যা সীমিত করতে চান, তাহলে অনুরোধ পরিবেশনের জন্য প্রস্তুত ও ওয়ার্ম রাখার জন্য ন্যূনতম সংখ্যক কন্টেইনার ইনস্ট্যান্স নির্দিষ্ট করে দিয়ে আপনি এই ডিফল্ট আচরণটি পরিবর্তন করতে পারেন।
একইভাবে, আগত অনুরোধের প্রতিক্রিয়ায় ইনস্ট্যান্সের স্কেলিং সীমিত করতে আপনি একটি সর্বোচ্চ সংখ্যা নির্ধারণ করতে পারেন। আপনার খরচ নিয়ন্ত্রণ করতে অথবা ডেটাবেসের মতো কোনো সহায়ক পরিষেবার সাথে সংযোগের সংখ্যা সীমিত করতে এই সেটিংটি ব্যবহার করুন।
এই সেটিংগুলো এবং প্রতি-ইনস্ট্যান্স কনকারেন্সি সেটিং (যা ২য় জেনারেশনে নতুন) একসাথে ব্যবহার করে, আপনি আপনার ফাংশনগুলোর স্কেলিং আচরণ নিয়ন্ত্রণ ও টিউন করতে পারেন। আপনার অ্যাপ্লিকেশন এবং ফাংশনের প্রকৃতিই নির্ধারণ করবে কোন সেটিংগুলো সবচেয়ে সাশ্রয়ী এবং সেরা পারফরম্যান্স দেবে।
কম ট্র্যাফিকের কিছু অ্যাপের জন্য, মাল্টি-কনকারেন্সি ছাড়া কম সিপিইউ অপশনই সর্বোত্তম। অন্য অ্যাপগুলোর ক্ষেত্রে, যেখানে কোল্ড স্টার্ট একটি গুরুতর সমস্যা, সেখানে উচ্চ কনকারেন্সি এবং ন্যূনতম ইনস্ট্যান্স সেট করার অর্থ হলো, ট্র্যাফিকের বড় ধরনের আকস্মিক বৃদ্ধি সামাল দেওয়ার জন্য এক সেট ইনস্ট্যান্সকে সর্বদা ওয়ার্ম রাখা হয়।
যেসব ছোট আকারের অ্যাপে খুব কম ট্র্যাফিক আসে, সেগুলোর ক্ষেত্রে উচ্চ কনকারেন্সি সহ সর্বোচ্চ ইনস্ট্যান্সের সংখ্যা কম রাখলে অ্যাপটি অতিরিক্ত খরচ ছাড়াই হঠাৎ ট্র্যাফিকের চাপ সামলাতে পারে। তবে, মনে রাখবেন যে সর্বোচ্চ ইনস্ট্যান্সের সংখ্যা খুব কম সেট করা হলে, এই সীমায় পৌঁছালে রিকোয়েস্ট বাতিল হয়ে যেতে পারে।
একই সাথে একাধিক অনুরোধের অনুমতি দিন
Cloud Functions for Firebase (1st gen)-এ, প্রতিটি ইনস্ট্যান্স একবারে একটি অনুরোধ পরিচালনা করতে পারত, তাই স্কেলিং আচরণ শুধুমাত্র সর্বনিম্ন এবং সর্বোচ্চ ইনস্ট্যান্স সেটিংস দ্বারা নির্ধারিত হত। ইনস্ট্যান্সের সংখ্যা নিয়ন্ত্রণের পাশাপাশি, Cloud Functions for Firebase (2nd gen)-এ আপনি concurrency বিকল্পের মাধ্যমে প্রতিটি ইনস্ট্যান্স একই সময়ে কতগুলি অনুরোধ পরিবেশন করতে পারবে তা নিয়ন্ত্রণ করতে পারেন। কনকারেন্সির ডিফল্ট মান হল ৮০, কিন্তু আপনি এটিকে ১ থেকে ১০০০-এর মধ্যে যেকোনো পূর্ণসংখ্যায় সেট করতে পারেন।
উচ্চতর কনকারেন্সি সেটিংযুক্ত ফাংশনগুলো কোল্ড স্টার্ট না করেই ট্র্যাফিকের আকস্মিক বৃদ্ধি সামাল দিতে পারে, কারণ প্রতিটি ইনস্ট্যান্সের সম্ভবত কিছু অতিরিক্ত ধারণক্ষমতা থাকে। যদি কোনো ইনস্ট্যান্স ৫০টি পর্যন্ত একযোগে অনুরোধ সামলানোর জন্য কনফিগার করা থাকে কিন্তু বর্তমানে মাত্র ২৫টি সামলাচ্ছে, তবে এটি একটি নতুন ইনস্ট্যান্স কোল্ড স্টার্ট করার প্রয়োজন ছাড়াই অতিরিক্ত ২৫টি অনুরোধের আকস্মিক বৃদ্ধি সামাল দিতে পারে। এর বিপরীতে, কনকারেন্সি সেটিং মাত্র ১ হলে, অনুরোধের এই আকস্মিক বৃদ্ধির কারণে ২৫টি কোল্ড স্টার্টের প্রয়োজন হতে পারে।
এই সরলীকৃত দৃশ্যকল্পটি কনকারেন্সির সম্ভাব্য কর্মদক্ষতা বৃদ্ধি প্রদর্শন করে। বাস্তবে, কনকারেন্সির মাধ্যমে কর্মদক্ষতা অপ্টিমাইজ করতে এবং কোল্ড স্টার্ট কমাতে স্কেলিং আচরণ আরও জটিল। Cloud Functions for Firebase 2nd gen-এর কনকারেন্সি Cloud Run দ্বারা চালিত হয় এবং এটি Cloud Run এর কন্টেইনার ইনস্ট্যান্স অটোস্কেলিং- এর নিয়মাবলী অনুসরণ করে।
Cloud Functions for Firebase (2nd gen)-এ উচ্চতর কনকারেন্সি সেটিংস নিয়ে পরীক্ষা-নিরীক্ষা করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
- একটি ব্যবহারিক সীমায় না পৌঁছানো পর্যন্ত, সর্বোত্তম পারফরম্যান্সের জন্য উচ্চতর কনকারেন্সি সেটিংসে বেশি সিপিইউ এবং র্যামের প্রয়োজন হতে পারে। উদাহরণস্বরূপ, যে ফাংশনটি ভারী ছবি বা ভিডিও প্রসেসিং করে, তার সিপিইউ এবং র্যাম সেটিংস সর্বোচ্চ করা হলেও, ১০০০টি যুগপৎ অনুরোধ সামলানোর মতো রিসোর্স তার নাও থাকতে পারে।
- যেহেতু Cloud Functions for Firebase (2nd gen) Cloud Run দ্বারা চালিত, তাই কনকারেন্সি অপ্টিমাইজ করার জন্য আপনি Google Cloud নির্দেশিকাও দেখতে পারেন।
- প্রোডাকশনে মাল্টিকনকারেন্সি চালু করার আগে একটি টেস্ট এনভায়রনমেন্টে তা পুঙ্খানুপুঙ্খভাবে পরীক্ষা করে নিন।
ন্যূনতম সংখ্যক ইনস্ট্যান্সকে উষ্ণ রাখুন
আপনি সোর্স কোডে কোনো ফাংশনের জন্য ন্যূনতম সংখ্যক ইনস্ট্যান্স নির্ধারণ করতে পারেন। উদাহরণস্বরূপ, এই ফাংশনটি 'কিপ ওয়ার্ম' (keep warm) করার জন্য ন্যূনতম ৫টি ইনস্ট্যান্স নির্ধারণ করে:
নোড.জেএস
const { onCall } = require("firebase-functions/v2/https");
exports.getAutocompleteResponse = onCall(
{
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
},
(event) => {
// Autocomplete user’s search term
}
);
পাইথন
@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:
ন্যূনতম ইনস্ট্যান্সের সংখ্যা নির্ধারণ করার সময় কিছু বিষয় বিবেচনা করতে হবে:
- যদি Cloud Functions for Firebase আপনার অ্যাপকে আপনার সেট করা সীমার বাইরে স্কেল করে, তাহলে সেই সীমার উপরের প্রতিটি ইনস্ট্যান্সের জন্য একটি কোল্ড স্টার্ট হবে।
- যেসব অ্যাপে ট্র্যাফিক হঠাৎ বেড়ে যায় বা হঠাৎ করে বেড়ে যায়, সেগুলোর ওপর কোল্ড স্টার্টের প্রভাব সবচেয়ে মারাত্মক। যদি আপনার অ্যাপে ট্র্যাফিক হঠাৎ করে বেড়ে যায় এবং আপনি এমন একটি মান নির্ধারণ করেন যাতে প্রতিটি ট্র্যাফিক বৃদ্ধির সাথে কোল্ড স্টার্ট কমে যায়, তাহলে আপনি ল্যাটেন্সি উল্লেখযোগ্যভাবে হ্রাস পেতে দেখবেন। যেসব অ্যাপে ট্র্যাফিক স্থির থাকে, সেগুলোর ক্ষেত্রে কোল্ড স্টার্ট পারফরম্যান্সকে মারাত্মকভাবে প্রভাবিত করার সম্ভাবনা কম।
প্রোডাকশন এনভায়রনমেন্টের জন্য ন্যূনতম ইনস্ট্যান্স সংখ্যা নির্ধারণ করা যুক্তিযুক্ত হতে পারে, কিন্তু টেস্টিং এনভায়রনমেন্টে এটি সাধারণত এড়িয়ে চলা উচিত। আপনার টেস্ট প্রজেক্টে ইনস্ট্যান্স সংখ্যা শূন্যে নামিয়ে আনতে এবং একই সাথে প্রোডাকশন প্রজেক্টে কোল্ড স্টার্টের ঝুঁকি কমাতে, আপনি আপনার প্যারামিটারাইজড কনফিগারেশনে একটি ন্যূনতম ইনস্ট্যান্স সংখ্যা নির্ধারণ করতে পারেন:
নোড.জেএস
const { onRequest } = require('firebase-functions/https'); const { defineInt, defineString } = require('firebase-functions/params'); // Define some parameters const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES'); const welcomeMessage = defineString('WELCOME_MESSAGE'); // To use configured parameters inside the config for a function, provide them // directly. To use them at runtime, call .value() on them. export const helloWorld = onRequest( { minInstances: minInstancesConfig }, (req, res) => { res.send(`${welcomeMessage.value()}! I am a function.`); } );পাইথন
MIN_INSTANCES = params.IntParam("HELLO_WORLD_MININSTANCES") WELCOME_MESSAGE = params.StringParam("WELCOME_MESSAGE") @https_fn.on_request(min_instances=MIN_INSTANCES.value()) def get_autocomplete_response(event: https_fn.Request) -> https_fn.Response: return https_fn.Response(f"{WELCOME_MESSAGE.value()} I'm a function.")
একটি ফাংশনের ইনস্ট্যান্সের সর্বোচ্চ সংখ্যা সীমিত করুন।
আপনি ফাংশন সোর্স কোডে সর্বোচ্চ ইনস্ট্যান্সের জন্য একটি মান নির্ধারণ করতে পারেন। উদাহরণস্বরূপ, এই ফাংশনটি একটি কাল্পনিক লিগ্যাসি ডেটাবেসকে অতিরিক্ত চাপে না ফেলার জন্য ১০০টি ইনস্ট্যান্সের একটি সীমা নির্ধারণ করে:
নোড.জেএস
const { onMessagePublished } = require("firebase-functions/v2/pubsub");
exports.mirrorevents = onMessagePublished(
{ topic: "topic-name", maxInstances: 100 },
(event) => {
// Connect to legacy database
}
);
পাইথন
@pubsub_fn.on_message_published(topic="topic-name", max_instances=100)
def mirrorevents(event: pubsub_fn.CloudEvent):
# Connect to legacy database
যদি কোনো HTTP ফাংশনকে তার সর্বোচ্চ ইনস্ট্যান্স সীমা পর্যন্ত স্কেল আপ করা হয়, তাহলে নতুন অনুরোধগুলি ৩০ সেকেন্ডের জন্য সারিবদ্ধ করা হয় এবং ততক্ষণে কোনো ইনস্ট্যান্স উপলব্ধ না থাকলে 429 Too Many Requests রেসপন্স কোড দিয়ে তা প্রত্যাখ্যান করা হয়।
সর্বোচ্চ ইনস্ট্যান্স সেটিংস ব্যবহারের সর্বোত্তম পদ্ধতি সম্পর্কে আরও জানতে, সর্বোচ্চ ইনস্ট্যান্স সেট করার এই সর্বোত্তম পদ্ধতিগুলো দেখুন।
একটি পরিষেবা অ্যাকাউন্ট সেট করুন
ফাংশনগুলির জন্য ডিফল্ট সার্ভিস অ্যাকাউন্টগুলিতে বিস্তৃত পরিসরের অনুমতি রয়েছে, যা আপনাকে অন্যান্য Firebase এবং Google Cloud পরিষেবাগুলির সাথে যোগাযোগ করার সুযোগ দেয়:
- ২য় প্রজন্মের ফাংশন: PROJECT_NUMBER -compute@developer.gserviceaccount.com ( কম্পিউট ইঞ্জিনের ডিফল্ট সার্ভিস অ্যাকাউন্ট হিসেবে নামকরণ করা)
- ১ম প্রজন্মের ফাংশন: PROJECT_ID @ appspot.gserviceaccount.com ( অ্যাপ ইঞ্জিনের ডিফল্ট সার্ভিস অ্যাকাউন্ট নামে পরিচিত)
আপনি হয়তো ডিফল্ট সার্ভিস অ্যাকাউন্টটি ওভাররাইড করে কোনো একটি ফাংশনকে শুধুমাত্র প্রয়োজনীয় রিসোর্সের মধ্যে সীমাবদ্ধ রাখতে চাইতে পারেন। এটি করার জন্য, আপনাকে একটি কাস্টম সার্ভিস অ্যাকাউন্ট তৈরি করতে হবে এবং serviceAccount কনফিগারেশন ভ্যালু ব্যবহার করে সেটিকে উপযুক্ত ফাংশনে অ্যাসাইন করতে হবে।
const { onRequest } = require("firebase-functions/https");
exports.helloWorld = onRequest(
{
// This function doesn't access other Firebase project resources, so it uses a limited service account.
serviceAccount:
"my-limited-access-sa@", // or prefer the full form: "my-limited-access-sa@my-project.iam.gserviceaccount.com"
},
(request, response) => {
response.send("Hello from Firebase!");
},
);
আপনি যদি আপনার সমস্ত ফাংশনের জন্য একই সার্ভিস অ্যাকাউন্ট সেট করতে চান, তাহলে setGlobalOptions ফাংশনটি ব্যবহার করে তা করতে পারেন।
টাইমআউট এবং মেমরি বরাদ্দ সেট করুন
কিছু ক্ষেত্রে, আপনার ফাংশনগুলির জন্য দীর্ঘ টাইমআউট মান বা বেশি পরিমাণে মেমরি বরাদ্দের বিশেষ প্রয়োজন হতে পারে। আপনি এই মানগুলি Google Cloud কনসোলে অথবা ফাংশনের সোর্স কোডে (শুধুমাত্র Firebase-এর জন্য) সেট করতে পারেন, এবং এর জন্য নিম্নলিখিত সর্বোচ্চ সময়সীমার মধ্যে টাইমআউট মান ব্যবহার করতে হবে:
- HTTP এবং কলযোগ্য ফাংশন: ৩৬০০ সেকেন্ড (৬০ মিনিট)
- নির্ধারিত/কার্যক্রমের সারি ফাংশন: ১৮০০ সেকেন্ড (৩০ মিনিট)
- অন্যান্য ইভেন্ট-চালিত ফাংশন: ৫৪০ সেকেন্ড (৯ মিনিট)
ফাংশনের সোর্স কোডে মেমরি অ্যালোকেশন এবং টাইমআউট সেট করতে, আপনার ফাংশনগুলো চালনাকারী ভার্চুয়াল মেশিনটিকে কাস্টমাইজ করার জন্য মেমরি এবং টাইমআউট সেকেন্ডের গ্লোবাল অপশনগুলো ব্যবহার করুন। উদাহরণস্বরূপ, এই Cloud Storage ফাংশনটি ১ GiB মেমরি ব্যবহার করে এবং ৩০০ সেকেন্ড পর টাইমআউট হয়ে যায়:
নোড.জেএস
exports.convertLargeFile = onObjectFinalized({
timeoutSeconds: 300,
memory: "1GiB",
}, (event) => {
// Do some complicated things that take a lot of memory and time
});
পাইথন
@storage_fn.on_object_finalized(timeout_sec=300, memory=options.MemoryOption.GB_1)
def convert_large_file(event: storage_fn.CloudEvent):
# Do some complicated things that take a lot of memory and time.
Google Cloud কনসোলে মেমরি বরাদ্দ এবং টাইমআউট সেট করতে:
- Google Cloud কনসোলে বাম দিকের মেনু থেকে Cloud Functions for Firebase নির্বাচন করুন।
- ফাংশন তালিকা থেকে কোনো ফাংশনের নামের উপর ক্লিক করে সেটি নির্বাচন করুন।
- উপরের মেনুতে থাকা এডিট আইকনে ক্লিক করুন।
- ‘Memory allocated’ লেবেলযুক্ত ড্রপ-ডাউন মেনু থেকে একটি মেমরি বরাদ্দ নির্বাচন করুন।
- উন্নত বিকল্পগুলি দেখতে 'More'-এ ক্লিক করুন এবং 'Timeout ' টেক্সট বক্সে সেকেন্ডের সংখ্যা লিখুন।
- ফাংশনটি আপডেট করতে সেভ-এ ক্লিক করুন।
সিপিইউ ডিফল্টগুলি ওভাররাইড করুন
২ জিবি পর্যন্ত মেমরি বরাদ্দ করা হলে, Cloud Functions for Firebase (২য় জেনারেশন)-এর প্রতিটি ফাংশন ডিফল্টরূপে একটি সিপিইউ ব্যবহার করে, এবং এরপর ৪ ও ৮ জিবির জন্য তা বেড়ে ২টি সিপিইউ হয়। উল্লেখ্য যে, এটি ১ম জেনারেশনের ডিফল্ট আচরণ থেকে উল্লেখযোগ্যভাবে ভিন্ন , যার ফলে কম-মেমরির ফাংশনগুলোর জন্য খরচ কিছুটা বেশি হতে পারে, যা নিম্নলিখিত সারণীতে দেখানো হয়েছে:
| র্যাম বরাদ্দ করা হয়েছে | সংস্করণ ১ ডিফল্ট সিপিইউ (ভগ্নাংশ) | সংস্করণ ২ ডিফল্ট সিপিইউ | প্রতি মিলিসেকেন্ডে মূল্য বৃদ্ধি |
|---|---|---|---|
| ১২৮ এমবি | ১/১২ | ১ | ১০.৫x |
| ২৫৬ মেগাবাইট | ১/৬ | ১ | ৫.৩x |
| ৫১২ মেগাবাইট | ১/৩ | ১ | ২.৭x |
| ১ জিবি | ৭/১২ | ১ | ১.৬x |
| ২জিবি | ১ | ১ | ১x |
| ৪জিবি | ২ | ২ | ১x |
| ৮জিবি | ২ | ২ | ১x |
| ১৬ জিবি | প্রযোজ্য নয় | ৪ | প্রযোজ্য নয় |
আপনি যদি আপনার ২য় প্রজন্মের ফাংশনগুলোর জন্য ১ম প্রজন্মের আচরণ পছন্দ করেন, তাহলে ১ম প্রজন্মের ডিফল্টগুলোকে একটি গ্লোবাল অপশন হিসেবে সেট করুন:
নোড.জেএস
// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });
পাইথন
# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")
সিপিইউ-নির্ভর ফাংশনগুলির জন্য, ২য় প্রজন্ম অতিরিক্ত সিপিইউ কনফিগার করার সুবিধা প্রদান করে। আপনি প্রতিটি ফাংশনের জন্য আলাদাভাবে সিপিইউ বুস্ট করতে পারেন, যেমনটি দেখানো হয়েছে:
নোড.জেএস
// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
// computer vision goes here
});
পাইথন
# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here