ফাংশন স্থাপনা এবং রানটাইম বিকল্পগুলি পরিচালনা করুন

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

ফাংশন স্থাপন

ফাংশন স্থাপন করতে, এই Firebase CLI কমান্ডটি চালান:

firebase deploy --only functions

ডিফল্টরূপে, Firebase CLI একই সময়ে index.js এর মধ্যে সমস্ত ফাংশন স্থাপন করে। যদি আপনার প্রজেক্টে 5টির বেশি ফাংশন থাকে, আমরা সুপারিশ করি যে আপনি শুধুমাত্র আপনার সম্পাদনা করা ফাংশনগুলিকে স্থাপন করতে নির্দিষ্ট ফাংশনের নামের সাথে --only পতাকা ব্যবহার করুন৷ এইভাবে নির্দিষ্ট ফাংশন স্থাপন করা স্থাপনার প্রক্রিয়াটিকে গতিশীল করে এবং আপনাকে স্থাপনার কোটায় দৌড়ানো এড়াতে সহায়তা করে। উদাহরণ স্বরূপ:

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

প্রচুর সংখ্যক ফাংশন স্থাপন করার সময়, আপনি আদর্শ কোটা অতিক্রম করতে পারেন এবং HTTP 429 বা 500 ত্রুটি বার্তা পেতে পারেন। এটি সমাধান করতে, 10 বা তার কম গোষ্ঠীতে ফাংশন স্থাপন করুন।

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

ডিফল্টরূপে, ফায়ারবেস CLI সোর্স কোডের functions/ ফোল্ডারে দেখায়। আপনি যদি পছন্দ করেন, আপনি কোডবেস বা ফাইলের একাধিক সেটে ফাংশন সংগঠিত করতে পারেন।

ফাংশন মুছুন

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

  • ফায়ারবেস CLI-তে functions:delete সহ স্পষ্টভাবে
  • স্পষ্টভাবে Google ক্লাউড কনসোলে
  • মোতায়েন করার পূর্বে index.js থেকে ফাংশনটি অপসারণ করে index.js

সমস্ত মুছে ফেলার ক্রিয়াকলাপ আপনাকে উত্পাদন থেকে ফাংশন অপসারণের আগে নিশ্চিত করতে অনুরোধ করে।

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

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

অন্তর্নিহিত ফাংশন মুছে ফেলার সাথে, ফায়ারবেস পার্স ইনডেক্স. index.js firebase deploy করে এবং ফাইল থেকে মুছে ফেলা যে কোনও ফাংশন উত্পাদন থেকে সরিয়ে দেয়।

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

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

একটি ফাংশন পুনঃনামকরণ করুন

একটি ফাংশনের নাম পরিবর্তন করতে, index.js এ ফাংশনের একটি নতুন নামকরণকৃত সংস্করণ তৈরি করুন এবং তারপরে দুটি পৃথক স্থাপনার কমান্ড চালান। প্রথম কমান্ডটি নতুন নামযুক্ত ফাংশন স্থাপন করে এবং দ্বিতীয় কমান্ডটি পূর্বে স্থাপন করা সংস্করণটিকে সরিয়ে দেয়। উদাহরণস্বরূপ, যদি আপনার webhook নামে একটি ফাংশন থাকে যা আপনি webhookNew এ পরিবর্তন করতে চান, তাহলে কোডটি নিম্নরূপ সংশোধন করুন:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

তারপরে নতুন ফাংশন স্থাপন করতে নিম্নলিখিত কমান্ডগুলি চালান:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

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

আপনি যদি এমন একটি ফাংশনের জন্য নির্দিষ্ট অঞ্চলগুলি পরিবর্তন করেন যা উত্পাদন ট্র্যাফিক পরিচালনা করে, আপনি এই পদক্ষেপগুলি ক্রমানুসারে সম্পাদন করে ইভেন্ট ক্ষতি রোধ করতে পারেন:

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

উদাহরণস্বরূপ, যদি আপনার কাছে webhook নামে একটি ফাংশন থাকে যা বর্তমানে us-central1 এর ডিফল্ট ফাংশন অঞ্চলে রয়েছে এবং আপনি এটিকে asia-northeast1 এ স্থানান্তর করতে চান, তাহলে আপনাকে প্রথমে ফাংশনের নাম পরিবর্তন করতে এবং অঞ্চলটি সংশোধন করতে আপনার সোর্স কোড পরিবর্তন করতে হবে .

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

তারপর চালানোর মাধ্যমে স্থাপন করুন:

firebase deploy --only functions:webhookAsia

এখন দুটি অভিন্ন ফাংশন চলছে: webhook চলছে us-central1 , এবং webhookAsia চলছে asia-northeast1 এ।

তারপর, webhook মুছুন:

firebase functions:delete webhook

এখন শুধুমাত্র একটি ফাংশন আছে - webhookAsia , যা asia-northeast1 1 এ চলছে।

একটি ফাংশনের ট্রিগার প্রকার পরিবর্তন করুন

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

  • লিগ্যাসি স্টোরেজ onChange ইভেন্ট থেকে onFinalize , onDelete , onArchive এবং onMetadataUpdate । ( বিটা থেকে v1 বা v2 আপগ্রেড গাইডে এই সম্পর্কে আরও জানুন)।
  • এক ধরনের ফায়ারবেস রিয়েলটাইম ডেটাবেস বা ক্লাউড ফায়ারস্টোর ইভেন্ট থেকে অন্য একটিতে পরিবর্তন করুন, যেমন জেনেরিক onWrite ইভেন্ট গ্রানুলার onCreate ইভেন্টে।

শুধুমাত্র সোর্স কোড পরিবর্তন করে এবং firebase deploy চালানোর মাধ্যমে একটি ফাংশনের ইভেন্টের ধরন পরিবর্তন করা সম্ভব নয়। ত্রুটিগুলি এড়াতে, এই পদ্ধতি দ্বারা একটি ফাংশনের ট্রিগার প্রকার পরিবর্তন করুন:

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

উদাহরণস্বরূপ, যদি আপনার কাছে একটি ফাংশন objectChanged থাকে যার উত্তরাধিকার onChange ইভেন্ট টাইপ রয়েছে, এবং আপনি এটিকে onFinalize এ পরিবর্তন করতে চান, প্রথমে ফাংশনটির নাম পরিবর্তন করুন এবং onFinalize ইভেন্ট টাইপ থাকতে এটি সম্পাদনা করুন।

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

তারপরে পুরানো ফাংশনটি মুছে ফেলার আগে প্রথমে নতুন ফাংশন তৈরি করতে নিম্নলিখিত কমান্ডগুলি চালান:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

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

ফায়ারবেসের জন্য ক্লাউড ফাংশন আপনাকে রানটাইম বিকল্পগুলি নির্বাচন করতে দেয় যেমন Node.js রানটাইম সংস্করণ এবং প্রতি-ফাংশন টাইমআউট, মেমরি বরাদ্দকরণ এবং সর্বনিম্ন/সর্বোচ্চ ফাংশন দৃষ্টান্ত।

Node.js সংস্করণ সেট করুন

ক্লাউড ফাংশন 2.0.0 এবং উচ্চতরের জন্য Firebase SDK Node.js রানটাইম নির্বাচন করার অনুমতি দেয়। আপনি এই সমর্থিত Node.js সংস্করণগুলির একটির সাথে সম্পর্কিত রানটাইম পরিবেশে একচেটিয়াভাবে একটি প্রকল্পে সমস্ত ফাংশন চালানোর জন্য চয়ন করতে পারেন:

  • Node.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (জুন 8, 2020-এ অবমুক্ত করা হয়েছে) 15 ডিসেম্বর, 2020-এ Firebase CLI-তে Node.js 8 রানটাইমে ফাংশন স্থাপন নিষ্ক্রিয় করা হয়েছিল৷ ইতিমধ্যেই-নিয়োজিত ফাংশনগুলির সম্পাদন ভবিষ্যতে কোনও সময়ে বন্ধ হয়ে যাবে; আপনি যদি Node.js 8 রানটাইমে ফাংশন স্থাপন করে থাকেন, আমরা আপনাকে Node.js 16 রানটাইমে আপগ্রেড করার পরামর্শ দিই।

Node.js সংস্করণ সেট করতে:

প্যাকেজ. package.json ফাইলে engines ফিল্ডে ভার্সন সেট করুন যা ইনিশিয়ালাইজেশনের সময় আপনার functions/ ডিরেক্টরিতে তৈরি হয়েছিল। উদাহরণস্বরূপ, শুধুমাত্র সংস্করণ 16 ব্যবহার করতে, package.json এ এই লাইনটি সম্পাদনা করুন:

  "engines": {"node": "16"}

engines ক্ষেত্র প্রয়োজন; আপনি ফাংশন স্থাপন এবং চালানোর জন্য এটিকে অবশ্যই সমর্থিত Node.js সংস্করণগুলির একটি নির্দিষ্ট করতে হবে। বর্তমানে firebase init functions এই ক্ষেত্রটিকে 16 এ সেট করে।

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

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

  1. নিশ্চিত করুন যে আপনার প্রকল্পটি ব্লেজ প্রাইসিং প্ল্যানে রয়েছে৷
  2. নিশ্চিত করুন যে আপনি Firebase CLI v9.17.0 বা তার পরবর্তী ব্যবহার করছেন।
  3. শুরু করার সময় আপনার functions/ ডিরেক্টরিতে তৈরি করা package.json ফাইলে engines মান পরিবর্তন করুন। উদাহরণস্বরূপ, আপনি যদি সংস্করণ 10 থেকে সংস্করণ 16-এ আপগ্রেড করছেন, তাহলে এন্ট্রিটি এইরকম হওয়া উচিত: "engines": {"node": "16"}
  4. ঐচ্ছিকভাবে, Firebase লোকাল এমুলেটর স্যুট ব্যবহার করে আপনার পরিবর্তনগুলি পরীক্ষা করুন।
  5. Firebase CLI v9.17.0 বা তার পরবর্তী ব্যবহার করে ফাংশন পুনরায় স্থাপন করুন।

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

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

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

ঠান্ডা শুরুর সংখ্যা কমিয়ে দিন

সোর্স কোডে একটি ফাংশনের জন্য ন্যূনতম সংখ্যক দৃষ্টান্ত সেট করতে, runWith প্যারামিটার ব্যবহার করুন। এই রানটাইম বিকল্পটি RuntimeOptions ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ একটি JSON অবজেক্ট গ্রহণ করে, যা minInstances এর মান নির্ধারণ করে। উদাহরণস্বরূপ, এই ফাংশনটি উষ্ণ রাখার জন্য সর্বনিম্ন 5টি দৃষ্টান্ত সেট করে:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

minInstances জন্য একটি মান সেট করার সময় এখানে কিছু বিষয় বিবেচনা করতে হবে:

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

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

একটি ফাংশনের জন্য সর্বাধিক সংখ্যক দৃষ্টান্ত সীমিত করুন

ফাংশন সোর্স কোডে সর্বাধিক উদাহরণ সেট করতে, runWith প্যারামিটার ব্যবহার করুন। এই রানটাইম বিকল্পটি RuntimeOptions ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ একটি JSON অবজেক্ট গ্রহণ করে, যা maxInstances এর জন্য মান নির্ধারণ করে। উদাহরণস্বরূপ, এই ফাংশনটি 100টি দৃষ্টান্তের একটি সীমা সেট করে যাতে একটি অনুমানমূলক উত্তরাধিকার ডাটাবেসকে অভিভূত না করে:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

যদি একটি HTTP ফাংশন maxInstances সীমা পর্যন্ত স্কেল করা হয়, নতুন অনুরোধগুলি 30 সেকেন্ডের জন্য সারিবদ্ধ করা হয় এবং তারপরে কোনও উদাহরণ উপলব্ধ না হলে 429 Too Many Requests প্রতিক্রিয়া কোড দিয়ে প্রত্যাখ্যান করা হয়।

সর্বাধিক দৃষ্টান্ত সেটিংস ব্যবহার করার জন্য সর্বোত্তম অনুশীলন সম্পর্কে আরও জানতে, maxInstances ব্যবহার করার জন্য এই সেরা অনুশীলনগুলি দেখুন

টাইমআউট এবং মেমরি বরাদ্দ সেট করুন

কিছু ক্ষেত্রে, আপনার ফাংশনগুলির একটি দীর্ঘ সময়সীমার মান বা মেমরির একটি বড় বরাদ্দের জন্য বিশেষ প্রয়োজনীয়তা থাকতে পারে। আপনি Google ক্লাউড কনসোলে বা ফাংশন সোর্স কোডে (শুধু ফায়ারবেস) এই মানগুলি সেট করতে পারেন৷

ফাংশন সোর্স কোডে মেমরি বরাদ্দ এবং টাইমআউট সেট করতে, ক্লাউড ফাংশন 2.0.0 এর জন্য Firebase SDK-এ চালু করা runWith প্যারামিটার ব্যবহার করুন। এই রানটাইম বিকল্পটি RuntimeOptions ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ একটি JSON অবজেক্ট গ্রহণ করে, যা timeoutSeconds এবং memory জন্য মান নির্ধারণ করে। উদাহরণস্বরূপ, এই স্টোরেজ ফাংশনটি 1GB মেমরি ব্যবহার করে এবং 300 সেকেন্ডের পরে সময় শেষ হয়:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

timeoutSeconds জন্য সর্বোচ্চ মান হল 540 , বা 9 মিনিট৷ একটি ফাংশনে প্রদত্ত মেমরির পরিমাণ ফাংশনের জন্য বরাদ্দকৃত CPU-এর সাথে মিলে যায়, যেমনটি memory বৈধ মানগুলির এই তালিকায় বিস্তারিত আছে:

  • 128MB — 200MHz
  • 256MB — 400MHz
  • 512MB — 800MHz
  • 1GB - 1.4 GHz
  • 2GB - 2.4 GHz
  • 4GB — 4.8 GHz
  • 8GB — 4.8 GHz

Google ক্লাউড কনসোলে মেমরি বরাদ্দ এবং সময়সীমা সেট করতে:

  1. গুগল গুগল ক্লাউড কনসোলে বাম মেনু থেকে ক্লাউড ফাংশন নির্বাচন করুন।
  2. ফাংশন তালিকায় তার নামের উপর ক্লিক করে একটি ফাংশন নির্বাচন করুন।
  3. উপরের মেনুতে সম্পাদনা আইকনে ক্লিক করুন।
  4. মেমরি বরাদ্দ লেবেলযুক্ত ড্রপ-ডাউন মেনু থেকে একটি মেমরি বরাদ্দ নির্বাচন করুন।
  5. উন্নত বিকল্পগুলি প্রদর্শন করতে আরও ক্লিক করুন, এবং টাইমআউট পাঠ্য বাক্সে কয়েক সেকেন্ড প্রবেশ করুন৷
  6. ফাংশন আপডেট করতে সংরক্ষণ করুন ক্লিক করুন.