ফাংশন ম্যানেজ করা

আপনি Firebase CLI কমান্ড ব্যবহার করে অথবা আপনার ফাংশনের সোর্স কোডে রানটাইম বিকল্প সেট করে ফাংশন ডেপ্লয়, মুছে দিতে ও পরিবর্তন করতে পারবেন।

ফাংশন ডিপ্লয় করা

ফাংশন ডেপ্লয় করতে, এই Firebase CLI কমান্ড চালান:

firebase deploy --only functions

ডিফল্ট হিসেবে, Firebase CLI আপনার সোর্সের মধ্যে থাকা সব ফাংশন একই সাথে ডেপ্লয় করে। আপনার প্রজেক্টে ৫টির বেশি ফাংশন থাকলে, আমরা সাজেস্ট করি যে আপনি --only ফ্ল্যাগ সহ নির্দিষ্ট ফাংশনের নাম ব্যবহার করুন যাতে শুধু সেইসব ফাংশনই ডেপ্লয় করা যায় যেগুলি আপনি এডিট করেছেন। নির্দিষ্ট ফাংশন ডেপ্লয় করা এইভাবে ডেপ্লয়মেন্ট প্রসেস দ্রুততর হয় এবং আপনাকে ডেপ্লয়মেন্ট কোটা এড়াতে সাহায্য করে। যেমন:

firebase deploy --only functions:addMessage,functions:makeUppercase

অনেক বেশি ফাংশন ডেপ্লয় করার সময়, আপনি হয়ত স্ট্যান্ডার্ড কোটা অতিক্রম করে যাবেন এবং HTTP 429 বা 500 ত্রুটি মেসেজ পাবেন। এটি সমাধান করতে, ১০টি বা তার কম ফাংশনের গ্রুপে ফাংশন ডেপ্লয় করুন।

উপলভ্য কমান্ডের সম্পূর্ণ তালিকা দেখতে Firebase CLI রেফারেন্স দেখুন।

ডিফল্ট হিসেবে, 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-কে ক্লিন-আপ নীতি সেট-আপ করতে বাধা দেয়।

ফাংশন মোছা

আপনি এইসব উপায়ে আগে ডিপ্লয় করা ফাংশন মুছে দিতে পারবেন:

  • functions:delete-এর সাথে Firebase CLI-তে স্পষ্টভাবে
  • 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 আপনার সোর্স পার্স করে এবং ফাইল থেকে সরিয়ে দেওয়া হয়েছে এমন যেকোনও ফাংশন প্রোডাকশন থেকে সরিয়ে দেয়।

ফাংশনের নাম, অঞ্চল বা ট্রিগার পরিবর্তন করা

আপনি যদি প্রোডাকশন ট্রাফিক হ্যান্ডেল করা ফাংশনের নাম পরিবর্তন বা অঞ্চল বা ট্রিগার পরিবর্তন করেন, তাহলে পরিবর্তনের সময় ইভেন্ট যাতে মিস না হয় তার জন্য এই বিভাগে দেওয়া ধাপগুলি অনুসরণ করুন। এইসব ধাপ অনুসরণ করার আগে, প্রথমে নিশ্চিত করুন যে আপনার ফাংশন আইডেমপোটেন্ট, কারণ পরিবর্তনের সময় আপনার ফাংশনের নতুন ও পুরনো, দুটি ভার্সনই একই সাথে চলবে।

ফাংশনের নাম পরিবর্তন করা

ফাংশনের নাম পরিবর্তন করতে, আপনার সোর্সে ফাংশনের একটি নতুন নাম পরিবর্তন করা ভার্সন তৈরি করুন এবং তারপরে দুটি আলাদা আলাদা ডিপ্লয়মেন্ট কমান্ড চালান। প্রথম কমান্ডটি নতুন নামযুক্ত ফাংশনটি ডেপ্লয় করে এবং দ্বিতীয় কমান্ডটি আগে ডেপ্লয় করা ভার্সনটি সরিয়ে দেয়। যেমন, আপনার যদি কোনও HTTP-ট্রিগার করা ওয়েব হুক থাকে, যেটি আপনি নাম পরিবর্তন করতে চান, তাহলে নিম্নলিখিতভাবে কোডটি সংশোধন করুন:

Node.js

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

Python

# 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

ফাংশনের অঞ্চল বা একাধিক অঞ্চল পরিবর্তন করা

প্রোডাকশন ট্রাফিক ম্যানেজ করছে এমন কোনও ফাংশনের জন্য নির্দিষ্ট রিজিয়ন পরিবর্তন করলে, আপনি এইসব ধাপ পরপর অনুসরণ করে ইভেন্ট মিস হওয়া আটকাতে পারেন:

  1. ফাংশনের নাম পরিবর্তন করুন এবং পছন্দমতো সেটির অঞ্চল বা অঞ্চলগুলি পরিবর্তন করুন।
  2. নাম পরিবর্তন করা ফাংশনটি ডিপ্লয় করুন, এর ফলে সাময়িকভাবে দুটি সেট অঞ্চলেই একই কোড রান করবে।
  3. আগের ফাংশনটি মুছে দিন।

যেমন, আপনার কাছে us-central1-এ বর্তমানে ডেপ্লয় করা একটি Cloud Firestore-ট্রিগার করা ফাংশন থাকলে এবং আপনি এটিকে asia-northeast1-এ মাইগ্রেট করতে চাইলে, আপনাকে প্রথমে ফাংশনের নাম পরিবর্তন করতে এবং অঞ্চলটি সংশোধন করতে সোর্স কোড পরিবর্তন করতে হবে।

Node.js

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

// after
exports.firestoreTriggerAsia = onDocumentCreated(
  {
    document: "my-collection/{docId}",
    region: "asia-northeast1",
  },
  (event) => {},
);

আপডেট করা কোডে অঞ্চল সহ সঠিক ইভেন্ট ফিল্টার (এই ক্ষেত্রে document) উল্লেখ করতে হবে। আরও তথ্যের জন্য Cloud Functions লোকেশন দেখুন।

Python

# 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 রান করানোর মাধ্যমে কোনও ফাংশনের ইভেন্টের ধরন পরিবর্তন করা সম্ভব নয়। সমস্যা এড়াতে, এই পদ্ধতি অনুসরণ করে কোনও ফাংশনের ট্রিগার টাইপ পরিবর্তন করুন:

  1. কাঙ্ক্ষিত ট্রিগার টাইপ সহ নতুন ফাংশন যোগ করতে সোর্স কোড পরিবর্তন করুন।
  2. ফাংশনটি ডেপ্লয় করুন, এর ফলে পুরনো ও নতুন, দুটি ফাংশনই সাময়িকভাবে রান করবে।
  3. Firebase CLI ব্যবহার করে প্রোডাকশন থেকে পুরনো ফাংশনটি স্পষ্টভাবে মুছে দিন।

যেমন, আপনার যদি এমন কোনও ফাংশন থাকে যা কোনও অবজেক্ট মুছে ফেলা হলে ট্রিগার করা হয়, কিন্তু তারপরে আপনি অবজেক্ট ভার্সনিং চালু করেছেন এবং পরিবর্তে আর্কাইভ ইভেন্টে সাবস্ক্রাইব করতে চান, তাহলে প্রথমে ফাংশনের নাম পরিবর্তন করুন এবং নতুন ট্রিগার ধরন যোগ করার জন্য এটি এডিট করুন।

Node.js

// before
const {onObjectDeleted} = require("firebase-functions/v2/storage");

exports.objectDeleted = onObjectDeleted((event) => {
    // ...
});

// after
const {onObjectArchived} = require("firebase-functions/v2/storage");

exports.objectArchived = onObjectArchived((event) => {
    // ...
});

Python

# 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) ব্যবহার করে সেট করা বিকল্পকে ওভাররাইড করবে।

আপনার ডেভেলপমেন্ট ওয়ার্কফ্লোতে যদি Google Cloud কনসোল বা gcloud CLI ব্যবহার করে রানটাইম বিকল্প ম্যানুয়ালি সেট করা হয় এবং আপনি না চান যে প্রতিটি ডিপ্লয়মেন্টে এইসব ভ্যালু ওভাররাইড করা হোক, তাহলে preserveExternalChanges বিকল্পটি true হিসেবে সেট করুন। এই বিকল্পটি true হিসেবে সেট করা থাকলে, Firebase আপনার কোডে সেট করা রানটাইম বিকল্পের সাথে আপনার ফাংশনের বর্তমানে ডিপ্লয় করা ভার্সনের সেটিংস নিচের অগ্রাধিকার অনুযায়ী মার্জ করে:

  1. ফাংশন কোডে বিকল্প সেট করা আছে: এক্সটার্নাল পরিবর্তন ওভাররাইড করুন।
  2. ফাংশন কোডে বিকল্পটি RESET_VALUE হিসেবে সেট করা আছে: ডিফল্ট ভ্যালু দিয়ে এক্সটার্নাল পরিবর্তন ওভাররাইড করুন।
  3. ফাংশন কোডে বিকল্প সেট করা নেই, কিন্তু বর্তমানে ডিপ্লয় করা ফাংশনে সেট করা আছে: ডিপ্লয় করা ফাংশনে উল্লেখ করা বিকল্প ব্যবহার করুন।

বেশিরভাগ পরিস্থিতির জন্য preserveExternalChanges: true বিকল্প ব্যবহার করার সুপারিশ করা হয় না কারণ আপনার ফাংশনের রানটাইম বিকল্পের জন্য আপনার কোড আর সম্পূর্ণ সোর্স অফ ট্রুথ থাকবে না। আপনি এটি ব্যবহার করলে, Google Cloud কনসোল চেক করুন অথবা কোনও ফাংশনের সম্পূর্ণ কনফিগারেশন দেখতে gcloud CLI ব্যবহার করুন।

Node.js ভার্সন সেট করা

Firebase-এর জন্য SDK Cloud Functions, Node.js রানটাইম বেছে নেওয়ার অনুমতি দেয়। আপনি কোনও প্রজেক্টের সমস্ত ফাংশন শুধুমাত্র রানটাইম এনভায়রনমেন্টে চালানোর বিকল্প বেছে নিতে পারেন, যা এইসব কাজ করে এমন Node.js ভার্সনের মধ্যে একটির সাথে সম্পর্কিত:

  • Node.js 22
  • Node.js 20
  • Node.js 18 (বন্ধ করে দেওয়া হয়েছে)

Node.js ভার্সন 14 ও 16 ২০২৫ সালের শুরুতে বন্ধ করে দেওয়া হয়েছে। এইসব ভার্সনে ডেপ্লয়মেন্ট বন্ধ করা আছে। Node.js-এর এই ভার্সনগুলির জন্য চলমান সহায়তা সংক্রান্ত গুরুত্বপূর্ণ তথ্য পেতে সহায়তা শিডিউল দেখুন।

Node.js ভার্সন সেট করতে:

ইনিশিয়ালাইজেশনের সময় আপনার functions/ ডিরেক্টরিতে তৈরি হওয়া package.json ফাইলের engines ফিল্ডে আপনি ভার্সন সেট করতে পারবেন। যেমন, শুধুমাত্র ভার্সন ২০ ব্যবহার করতে, package.json-এ এই লাইনটি এডিট করুন:

  "engines": {"node": "20"}

আপনি Yarn প্যাকেজ ম্যানেজার ব্যবহার করলে অথবা engines ফিল্ডের জন্য অন্য কোনও নির্দিষ্ট প্রয়োজনীয়তা থাকলে, আপনি Cloud Functions-এর জন্য Firebase SDK-এর রানটাইম firebase.json-এ সেট করতে পারেন:

  {
    "functions": {
      "runtime": "nodejs20" // or nodejs22
    }
  }

CLI, package.json-এ আলাদাভাবে সেট করা যেকোনও ভ্যালু বা রেঞ্জের পরিবর্তে firebase.json-এ সেট করা ভ্যালু ব্যবহার করে।

আপনার Node.js রানটাইম আপগ্রেড করা

আপনার Node.js রানটাইম আপগ্রেড করতে:

  1. আপনার প্রোজেক্ট Blaze প্রাইসিং প্ল্যানে আছে কিনা তা ভাল করে দেখে নিন।
  2. আপনি Firebase CLI v11.18.0 বা এর পরের যেকোনও ভার্সন ব্যবহার করছেন কিনা তা ভালোভাবে দেখে নিন।
  3. ইনিশিয়ালাইজেশনের সময় আপনার functions/ ডিরেক্টরিতে তৈরি হওয়া package.json ফাইলে engines ভ্যালু পরিবর্তন করুন। যেমন, আপনি যদি ভার্সন ১৮ থেকে ভার্সন ২০-এ আপগ্রেড করেন, তাহলে এন্ট্রিটি এইরকম দেখতে হবে: "engines": {"node": "20"}
  4. ঐচ্ছিকভাবে, Firebase Local Emulator Suite ব্যবহার করে আপনার পরিবর্তন পরীক্ষা করুন।
  5. সব ফাংশন আবার ডেপ্লয় করুন।

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 ডকুমেন্টেশন থেকে আরও জানুন।

Python ভার্সন সেট করা

Firebase Cloud Functions ভার্সন 12.0.0 ও তার পরের যেকোনও ভার্সনের SDK, Python রানটাইম বেছে নেওয়ার অনুমতি দেয়। firebase.json-এ রানটাইম ভার্সন সেট করুন, যেমন দেখানো হয়েছে:

  {
    "functions": {
      "runtime": "python310" // or python311
    }
  }

স্কেলিং আচরণ নিয়ন্ত্রণ করা

ডিফল্ট হিসেবে, Cloud Functions for Firebase ইনকামিং অনুরোধের সংখ্যার উপর ভিত্তি করে চলমান ইনস্ট্যান্সের সংখ্যা স্কেল করে। ট্রাফিক কমে গেলে, এটি সম্ভাব্যভাবে ইনস্ট্যান্সের সংখ্যা কমিয়ে শূন্য করে দেয়। তবে, আপনার অ্যাপে যদি কম লেটেন্সি প্রয়োজন হয় এবং আপনি কোল্ড স্টার্টের সংখ্যা সীমিত করতে চান, তাহলে আপনি এই ডিফল্ট আচরণ পরিবর্তন করতে পারেন। এর জন্য, কন্টেনার ইনস্ট্যান্সের ন্যূনতম সংখ্যা নির্দিষ্ট করতে হবে যা ওয়ার্ম এবং অনুরোধ পরিবেশন করার জন্য প্রস্তুত রাখা হবে।

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

প্রতি-ইনস্ট্যান্স কনকারেন্সি সেটিং (২য় জেনারেশনে নতুন ফিচার) সহ এইসব সেটিং ব্যবহার করে, আপনি ফাংশনের স্কেলিং আচরণ নিয়ন্ত্রণ ও টিউন করতে পারবেন। আপনার অ্যাপ্লিকেশন ও ফাংশনের ধরন নির্ধারণ করবে যে কোন সেটিংস সবচেয়ে সাশ্রয়ী এবং সেরা পারফর্ম্যান্স দেবে।

কম ট্রাফিক থাকা কিছু অ্যাপের ক্ষেত্রে, মাল্টি-কনকারেন্সি ছাড়া কম CPU বিকল্প সবচেয়ে ভাল। অন্যান্য ক্ষেত্রে, যেখানে কোল্ড স্টার্ট একটি গুরুত্বপূর্ণ সমস্যা, সেখানে হাই কনকারেন্সি এবং ন্যূনতম ইনস্ট্যান্স সেট করার অর্থ হল, ট্রাফিকে বড় স্পাইক হ্যান্ডেল করার জন্য ইনস্ট্যান্সের একটি সেটকে সবসময় ওয়ার্ম রাখা হয়।

খুব কম ট্রাফিক পাওয়া ছোট স্কেলের অ্যাপের জন্য, বেশি কনকারেন্সি সহ কম সর্বোচ্চ ইনস্ট্যান্স সেট করার অর্থ হল, অ্যাপটি অতিরিক্ত খরচ না করেই ট্রাফিকের আকস্মিক বৃদ্ধি সামলাতে পারবে। তবে, মনে রাখবেন যে maximum instances খুব কম সেট করা হলে, সর্বাধিক সংখ্যায় পৌঁছে গেলে অনুরোধ ড্রপ করা হতে পারে।

একসাথে একাধিক অনুরোধের অনুমতি দিন

Cloud Functions for Firebase (1st gen)-এ, প্রতিটি ইনস্ট্যান্স একবারে একটি অনুরোধ হ্যান্ডেল করতে পারে, তাই স্কেলিং আচরণ শুধুমাত্র ন্যূনতম এবং সর্বাধিক ইনস্ট্যান্স সেটিংসের সাথে সেট করা হয়েছিল। Cloud Functions for Firebase (2nd gen)-এ ইনস্ট্যান্সের সংখ্যা নিয়ন্ত্রণ করা ছাড়াও, আপনি concurrency বিকল্পের সাহায্যে প্রতিটি ইনস্ট্যান্স একই সময়ে কতগুলি অনুরোধ পূরণ করতে পারবে তা নিয়ন্ত্রণ করতে পারেন। কনকারেন্সির ডিফল্ট ভ্যালু হল ৮০, কিন্তু আপনি এটিকে ১ থেকে ১০০০-এর মধ্যে যেকোনও পূর্ণসংখ্যায় সেট করতে পারেন।

উচ্চতর কনকারেন্সি সেটিংস সহ ফাংশনগুলি কোল্ড স্টার্ট না করেই ট্রাফিকের স্পাইক শোষণ করতে পারে, কারণ প্রতিটি ইনস্ট্যান্সে সম্ভবত কিছু হেডরুম থাকে। কোনও ইনস্ট্যান্স যদি ৫০টি পর্যন্ত কনকারেন্ট অনুরোধ হ্যান্ডেল করার জন্য কনফিগার করা থাকে, কিন্তু বর্তমানে ২৫টি অনুরোধ হ্যান্ডেল করে, তাহলে এটি ২৫টি অতিরিক্ত অনুরোধের স্পাইক হ্যান্ডেল করতে পারে। এর জন্য নতুন ইনস্ট্যান্স কোল্ড স্টার্ট করার প্রয়োজন নেই। অন্যদিকে, কনকারেন্সি সেটিং ১ হলে, অনুরোধের সংখ্যায় এই বৃদ্ধি ২৫টি কোল্ড স্টার্টের কারণ হতে পারে।

এই সরলীকৃত দৃশ্যকল্পটি কনকারেন্সির সম্ভাব্য দক্ষতা বৃদ্ধিকে প্রদর্শন করে। বাস্তবে, কনকারেন্সি সহ দক্ষতা অপ্টিমাইজ করা এবং কোল্ড স্টার্ট কমানোর জন্য স্কেলিং আচরণ আরও জটিল। Concurrency in Cloud Functions for Firebase 2nd gen Cloud Run দ্বারা পরিচালিত হয় এবং Cloud Run-এর কন্টেনার ইনস্ট্যান্স অটোস্কেলিং সংক্রান্ত নিয়ম মেনে চলে।

Cloud Functions for Firebase (2nd gen)-এ আরও বেশি কনকারেন্সি সেটিংস নিয়ে এক্সপেরিমেন্ট করার সময়, নিম্নলিখিত বিষয়গুলি মনে রাখবেন:

  • একসাথে করা যায় এমন টাস্কের বর্ধিত সেটিংসের জন্য একটি ব্যবহারিক সীমা না পৌঁছানো পর্যন্ত অপ্টিমাল পারফর্ম্যান্সের জন্য আরও বেশি সিপিইউ ও RAM প্রয়োজন হতে পারে। কোনও ফাংশন যদি প্রচুর ছবি বা ভিডিও প্রসেস করে, তাহলে সেটির রিসোর্স কম থাকতে পারে। এর ফলে, CPU ও RAM সেটিংস সর্বাধিক করা থাকলেও, সেটি হয়ত ১০০০টি অনুরোধ একসাথে ম্যানেজ করতে পারবে না।
  • Cloud Functions for Firebase (2nd gen) যেহেতু Cloud Run দ্বারা পরিচালিত হয়, তাই আপনি কনকারেন্সি অপ্টিমাইজ করা সংক্রান্ত Google Cloud নির্দেশিকাও দেখতে পারেন।
  • প্রোডাকশনে মাল্টিকনকারেন্সি চালু করার আগে টেস্ট এনভায়রনমেন্টে মাল্টিকনকারেন্সি ভালোভাবে পরীক্ষা করে নিতে ভুলবেন না।

ন্যূনতম সংখ্যক ইনস্ট্যান্স চালু রাখুন

আপনি সোর্স কোডে কোনও ফাংশনের জন্য ন্যূনতম ইনস্ট্যান্সের সংখ্যা সেট করতে পারবেন। যেমন, এই ফাংশনটি গরম রাখার জন্য ন্যূনতম ৫টি ইনস্ট্যান্স সেট করে:

Node.js

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

Python

@https_fn.on_call(min_instances=5)
def get_autocomplete_response(event: https_fn.CallableRequest) -> https_fn.Response:

ন্যূনতম ইনস্ট্যান্সের ভ্যালু সেট করার সময় এইসব বিষয় বিবেচনা করে দেখুন:

  • Cloud Functions for Firebase আপনার অ্যাপকে আপনার সেটিংসের উপরে স্কেল করলে, আপনি সেই থ্রেশহোল্ডের উপরে প্রতিটি ইনস্ট্যান্সের জন্য কোল্ড স্টার্ট অনুভব করবেন।
  • স্পাইকি ট্রাফিক সহ অ্যাপের উপর কোল্ড স্টার্টের সবচেয়ে গুরুতর প্রভাব পড়ে। আপনার অ্যাপে ট্রাফিকের পরিমাণ হঠাৎ করে বেড়ে গেলে এবং আপনি যদি এমন একটি মান সেট করেন যা প্রতিটি ট্রাফিক বৃদ্ধির সাথে সাথে কোল্ড স্টার্টের সংখ্যা কমিয়ে দেয়, তাহলে আপনি উল্লেখযোগ্যভাবে ল্যাটেন্সি কমে যাওয়া দেখতে পাবেন। যেসব অ্যাপে ট্রাফিক সবসময় থাকে, সেগুলির পারফর্ম্যান্সের উপর কোল্ড স্টার্টের প্রভাব খুব বেশি পড়ে না।
  • প্রোডাকশন এনভায়রনমেন্টের জন্য ন্যূনতম ইনস্ট্যান্স সেট করা যুক্তিযুক্ত হতে পারে, কিন্তু সাধারণত টেস্টিং এনভায়রনমেন্টে এটি এড়িয়ে যাওয়া উচিত। আপনার টেস্ট প্রোজেক্টে স্কেল-টু-জিরো করতে, কিন্তু আপনার প্রোডাকশন প্রোজেক্টে কোল্ড স্টার্ট কমাতেও, আপনি প্যারামিটারাইজড কনফিগারেশনে ন্যূনতম ইনস্ট্যান্স ভ্যালু সেট করতে পারেন:

    Node.js

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

    Python

    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.")
    

ফাংশনের সর্বাধিক ইনস্ট্যান্সের সংখ্যা সীমিত করা

ফাংশন সোর্স কোডে আপনি সর্বাধিক ইনস্ট্যান্সের জন্য একটি ভ্যালু সেট করতে পারবেন। যেমন, এই ফাংশনটি একটি কাল্পনিক লিগ্যাসি ডেটাবেসকে অত্যধিক ডেটা দিয়ে পূর্ণ না করার জন্য ১০০টি ইনস্ট্যান্সের সীমা সেট করে:

Node.js

const { onMessagePublished } = require("firebase-functions/v2/pubsub");

exports.mirrorevents = onMessagePublished(
  { topic: "topic-name", maxInstances: 100 },
  (event) => {
    // Connect to legacy database
  }
);

Python

@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 (Compute Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট নামে পরিচিত)
  • ১ম জেনারেশনের ফাংশন: PROJECT_ID@appspot.gserviceaccount.com (App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট নামে পরিচিত)

আপনি ডিফল্ট পরিষেবা অ্যাকাউন্ট ওভাররাইড করতে এবং কোনও ফাংশনকে ঠিক প্রয়োজনীয় রিসোর্সে সীমাবদ্ধ করতে চাইতে পারেন। আপনি কাস্টম পরিষেবা অ্যাকাউন্ট তৈরি করে এটি করতে পারেন এবং 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 ফাংশন 1GiB মেমরি ব্যবহার করে এবং 300 সেকেন্ড পরে টাইম-আউট হয়ে যায়:

Node.js

exports.convertLargeFile = onObjectFinalized({
  timeoutSeconds: 300,
  memory: "1GiB",
}, (event) => {
  // Do some complicated things that take a lot of memory and time
});

Python

@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 কনসোলে মেমরি অ্যালোকেশন ও টাইম-আউট সেট করতে:

  1. Google Cloud কনসোলে, বাঁদিকের মেনু থেকে Cloud Functions for Firebase বেছে নিন।
  2. ফাংশনের তালিকায় সেটির নামে ক্লিক করে একটি ফাংশন বেছে নিন।
  3. উপরের মেনুতে এডিট করুন আইকনে ক্লিক করুন।
  4. অ্যালোকেট করা মেমরি লেবেলযুক্ত ড্রপডাউন মেনু থেকে মেমরি অ্যালোকেশন বেছে নিন।
  5. উন্নত বিকল্প দেখতে আরও বিকল্পে ক্লিক করুন এবং টাইম-আউট টেক্সট বক্সে সেকেন্ডের সংখ্যা লিখুন।
  6. ফাংশন আপডেট করতে সেভ করুন বিকল্পে ক্লিক করুন।

সিপিইউ ডিফল্ট ওভাররাইড করা

সর্বাধিক ২ জিবি মেমরি বরাদ্দ করা হয়, Cloud Functions for Firebase (2nd gen) ডিফল্ট হিসেবে প্রতিটি ফাংশনের জন্য একটি CPU বরাদ্দ করা হয় এবং তারপর ৪ ও ৮ জিবি মেমরির জন্য ২টি CPU বরাদ্দ করা হয়। মনে রাখবেন যে এটি ১ম জেনারেশনের ডিফল্ট আচরণ থেকে উল্লেখযোগ্যভাবে আলাদা। এর ফলে নিম্ন মেমরি ফাংশনের জন্য কিছুটা বেশি খরচ হতে পারে, যা নিম্নলিখিত সারণীতে দেখানো হয়েছে:

বরাদ্দ করা RAM ভার্সন ১-এর ডিফল্ট সিপিইউ (ভগ্নাংশ) ভার্সন ২-এর ডিফল্ট সিপিইউ প্রতি মিলিসেকেন্ডে দাম বৃদ্ধি
১২৮ এমবি ১/১২ 1 ১০.৫x
২৫৬ এমবি ১/৬ 1 ৫.৩x
৫১২ এমবি ১/৩ 1 ২.৭x
১ জিবি ৭/১২ 1 ১.৬x
২ জিবি 1 1 ১x
৪ জিবি 2 2 ১x
৮ জিবি 2 2 ১x
১৬ জিবি n/a 4 n/a

আপনার সেকেন্ড জেনারেশন ফাংশনের জন্য ফার্স্ট জেনারেশন আচরণ পছন্দ করলে, গ্লোবাল বিকল্প হিসেবে ফার্স্ট জেনারেশন ডিফল্ট সেট করুন:

Node.js

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcf_gen1' });

Python

# Use 1st gen behavior
set_global_options(cpu="gcf_gen1")

CPU-ইনটেনসিভ ফাংশনের জন্য, ২য় জেনারেশন অতিরিক্ত CPU কনফিগার করার সুবিধা প্রদান করে। আপনি ফাংশন পিছু সিপিইউ বুস্ট করতে পারবেন, যেমন দেখানো হয়েছে:

Node.js

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});

Python

# Boost CPU in a function:
@storage_fn.on_object_finalized(cpu=2)
def analyze_image(event: storage_fn.CloudEvent):
# computer vision goes here