টিপস & কৌশল

এই দস্তাবেজটি Cloud Functions ডিজাইন, বাস্তবায়ন, পরীক্ষা এবং স্থাপনের জন্য সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

যথার্থতা

এই বিভাগটি Cloud Functions ডিজাইন এবং বাস্তবায়নের জন্য সাধারণ সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

অক্ষমতার ফাংশন লিখ

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

ব্যাকগ্রাউন্ড কার্যক্রম শুরু করবেন না

ব্যাকগ্রাউন্ড অ্যাক্টিভিটি হল আপনার ফাংশন বন্ধ হয়ে যাওয়ার পর যা ঘটে। একটি ফাংশন ইনভোকেশন শেষ হয়ে গেলে ফাংশন রিটার্ন করলে বা অন্যথায় সম্পূর্ণ হওয়ার সংকেত দেয়, যেমন Node.js ইভেন্ট-চালিত ফাংশনে callback আর্গুমেন্ট কল করে। সুন্দর সমাপ্তির পরে চালানো যেকোন কোড CPU অ্যাক্সেস করতে পারে না এবং কোনো অগ্রগতি করতে পারে না।

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

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

সর্বদা অস্থায়ী ফাইল মুছে দিন

অস্থায়ী ডিরেক্টরিতে স্থানীয় ডিস্ক স্টোরেজ একটি ইন-মেমরি ফাইল সিস্টেম। আপনি যে ফাইলগুলি লেখেন সেগুলি আপনার ফাংশনের জন্য উপলব্ধ মেমরি ব্যবহার করে এবং কখনও কখনও আহ্বানের মধ্যে টিকে থাকে। এই ফাইলগুলি স্পষ্টভাবে মুছে ফেলতে ব্যর্থ হলে শেষ পর্যন্ত মেমরির বাইরের ত্রুটি এবং পরবর্তী ঠান্ডা শুরু হতে পারে।

আপনি Google ক্লাউড কনসোলের ফাংশনের তালিকায় এটি নির্বাচন করে এবং মেমরি ব্যবহারের প্লট বেছে নিয়ে একটি পৃথক ফাংশন দ্বারা ব্যবহৃত মেমরি দেখতে পারেন।

আপনার যদি দীর্ঘমেয়াদী স্টোরেজ অ্যাক্সেসের প্রয়োজন হয়, Cloud Storage বা NFS ভলিউম সহ Cloud Run ভলিউম মাউন্ট ব্যবহার করার কথা বিবেচনা করুন।

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

ফাংশন ফ্রেমওয়ার্ক

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

এটি করার জন্য, প্রাসঙ্গিক লক ফাইলে আপনার পছন্দের সংস্করণটি অন্তর্ভুক্ত করুন (উদাহরণস্বরূপ, Node.js-এর জন্য package-lock.json , অথবা Python-এর জন্য requirements.txt )।

যদি ফাংশন ফ্রেমওয়ার্ক স্পষ্টভাবে একটি নির্ভরতা হিসাবে তালিকাভুক্ত না হয়, এটি সর্বশেষ উপলব্ধ সংস্করণ ব্যবহার করে বিল্ড প্রক্রিয়া চলাকালীন স্বয়ংক্রিয়ভাবে যোগ করা হবে।

টুলস

এই বিভাগটি Cloud Functions বাস্তবায়ন, পরীক্ষা এবং ইন্টারঅ্যাক্ট করার জন্য সরঞ্জামগুলি কীভাবে ব্যবহার করতে হয় তার নির্দেশিকা প্রদান করে৷

স্থানীয় উন্নয়ন

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

Firebase ডেভেলপাররা Firebase CLI Cloud Functions এমুলেটর ব্যবহার করতে পারেন।

আরম্ভ করার সময় স্থাপনার সময়সীমা এড়িয়ে চলুন

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

Firebase CLI-তে স্থাপনার সময় আপনার ফাংশনগুলি আবিষ্কার করার জন্য একটি ডিফল্ট সময়সীমা রয়েছে। যদি আপনার ফাংশনের সোর্স কোডে ইনিশিয়ালাইজেশন লজিক (মডিউল লোড করা, নেটওয়ার্ক কল করা ইত্যাদি) এই সময়সীমা অতিক্রম করে, তাহলে স্থাপনা ব্যর্থ হতে পারে।

সময়সীমা এড়াতে, নিম্নলিখিত কৌশলগুলির মধ্যে একটি ব্যবহার করুন:

স্থাপনার সময় ইনিশিয়ালাইজেশন কোড চালানো এড়াতে onInit() হুক ব্যবহার করুন। onInit() হুকের ভিতরের কোড তখনই চলবে যখন ফাংশনটি ক্লাউড রান ফাংশনে স্থাপন করা হবে, ডিপ্লয়মেন্ট প্রক্রিয়ার সময় নয়।

Node.js পাইথন
const { onInit } = require('firebase-functions/v2/core');
const { onRequest } = require('firebase-functions/v2/https');

// Example of a slow initialization task
function slowInitialization() {
  // Simulate a long-running operation (e.g., loading a large model, network request).
  return new Promise(resolve => {
      setTimeout(() => {
          console.log("Slow initialization complete");
          resolve("Initialized Value");
      }, 20000); // Simulate a 20-second delay
  });
}
let initializedValue;

onInit(async () => {
  initializedValue = await slowInitialization();
});

exports.myFunction = onRequest((req, res) => {
  // Access the initialized value. It will be ready after the first invocation.
  res.send(`Value: ${initializedValue}`);
});
from firebase_functions.core import init
from firebase_functions import https_fn
import time

# Example of a slow initialization task
def _slow_initialization():
  time.sleep(20)  # Simulate a 20-second delay
  print("Slow initialization complete")
  return "Initialized Value"

_initialized_value = None

@init
def initialize():
  global _initialized_value
  _initialized_value = _slow_initialization()

@https_fn.on_request()
def my_function(req: https_fn.Request) -> https_fn.Response:
  # Access the initialized value. It will be ready after the first invocation.
  return https_fn.Response(f"Value: {_initialized_value}")

(বিকল্প) আবিষ্কারের সময়সীমা বাড়ান

যদি আপনি onInit() ব্যবহার করার জন্য আপনার কোড রিফ্যাক্টর করতে না পারেন, তাহলে আপনি FUNCTIONS_DISCOVERY_TIMEOUT এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে CLI এর ডিপ্লয়মেন্ট টাইমআউট বাড়াতে পারেন:

$ export FUNCTIONS_DISCOVERY_TIMEOUT=30
$ firebase deploy --only functions

ইমেল পাঠাতে Sendgrid ব্যবহার করুন

Cloud Functions পোর্ট 25-এ আউটবাউন্ড সংযোগের অনুমতি দেয় না, তাই আপনি একটি SMTP সার্ভারে অ-সুরক্ষিত সংযোগ করতে পারবেন না। ইমেল পাঠানোর প্রস্তাবিত উপায় হল একটি তৃতীয় পক্ষের পরিষেবা যেমন SendGrid ব্যবহার করা। আপনি Google Compute Engine-এর জন্য একটি ইনস্ট্যান্স টিউটোরিয়াল থেকে পাঠানো ইমেল- এ ইমেল পাঠানোর জন্য অন্যান্য বিকল্প খুঁজে পেতে পারেন।

কর্মক্ষমতা

এই বিভাগে কর্মক্ষমতা অপ্টিমাইজ করার জন্য সর্বোত্তম অনুশীলন বর্ণনা করে।

কম সংগতি এড়িয়ে চলুন

যেহেতু কোল্ড স্টার্ট ব্যয়বহুল, একটি স্পাইকের সময় সম্প্রতি শুরু হওয়া দৃষ্টান্তগুলি পুনরায় ব্যবহার করতে সক্ষম হওয়া লোড পরিচালনা করার জন্য একটি দুর্দান্ত অপ্টিমাইজেশন। সীমিত সহগামীতা সীমিত করে কিভাবে বিদ্যমান দৃষ্টান্তগুলিকে লিভারেজ করা যায়, তাই আরও ঠান্ডা শুরু হয়।

ক্রমবর্ধমান সঙ্গতি প্রতি দৃষ্টান্তে একাধিক অনুরোধ স্থগিত করতে সাহায্য করে, লোডের স্পাইকগুলি পরিচালনা করা সহজ করে তোলে।

নির্ভরতাকে বুদ্ধিমানের সাথে ব্যবহার করুন

যেহেতু ফাংশন স্টেটলেস, এক্সিকিউশন এনভায়রনমেন্ট প্রায়শই স্ক্র্যাচ থেকে শুরু করা হয় ( কোল্ড স্টার্ট হিসাবে পরিচিত সময়)। যখন একটি ঠান্ডা শুরু হয়, তখন ফাংশনের বিশ্বব্যাপী প্রেক্ষাপট মূল্যায়ন করা হয়।

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

ভবিষ্যতের আহ্বানে বস্তুগুলিকে পুনরায় ব্যবহার করতে বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করুন

কোন গ্যারান্টি নেই যে একটি ফাংশনের অবস্থা ভবিষ্যতের আহ্বানের জন্য সংরক্ষণ করা হবে। যাইহোক, Cloud Functions প্রায়ই পূর্ববর্তী আহ্বানের কার্যকরী পরিবেশকে পুনর্ব্যবহার করে। আপনি যদি বৈশ্বিক সুযোগে একটি পরিবর্তনশীল ঘোষণা করেন, তাহলে এর মান পুনরায় গণনা না করেই পরবর্তী আহ্বানে পুনরায় ব্যবহার করা যেতে পারে।

এইভাবে আপনি বস্তুগুলি ক্যাশে করতে পারেন যা প্রতিটি ফাংশন আহ্বানে পুনরায় তৈরি করা ব্যয়বহুল হতে পারে। এই ধরনের বস্তুগুলিকে ফাংশন বডি থেকে গ্লোবাল স্কোপে স্থানান্তর করার ফলে উল্লেখযোগ্য কর্মক্ষমতা উন্নতি হতে পারে। নিম্নলিখিত উদাহরণটি প্রতি ফাংশন ইনস্ট্যান্সে শুধুমাত্র একবার একটি ভারী বস্তু তৈরি করে এবং প্রদত্ত উদাহরণে পৌঁছানো সমস্ত ফাংশন আহ্বান জুড়ে এটি ভাগ করে:

Node.js পাইথন
console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
  console.log('Function invocation');
  const perFunction = lightweightComputation();

  res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

এই HTTP ফাংশনটি একটি রিকোয়েস্ট অবজেক্ট ( flask.Request ) নেয় এবং রেসপন্স টেক্সট বা মানগুলির যেকোন সেট ফেরত দেয় যা make_response ব্যবহার করে Response অবজেক্টে পরিণত করা যায়।

গ্লোবাল স্কোপে নেটওয়ার্ক সংযোগ, লাইব্রেরি রেফারেন্স এবং API ক্লায়েন্ট অবজেক্ট ক্যাশে করা বিশেষভাবে গুরুত্বপূর্ণ। উদাহরণের জন্য নেটওয়ার্কিং অপ্টিমাইজ করা দেখুন।

ন্যূনতম সংখ্যক দৃষ্টান্ত সেট করে ঠান্ডা শুরু কম করুন

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

এই রানটাইম বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য নিয়ন্ত্রণ স্কেলিং আচরণ দেখুন।

কোল্ড স্টার্ট এবং ইনিশিয়ালাইজেশন সম্পর্কে নোট

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

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

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

আপনি যদি ভাষার উপর নির্ভর করে বৈশ্বিক পরিসরে ভেরিয়েবলগুলিকে আরম্ভ করেন, দীর্ঘ প্রারম্ভিক সময়ের ফলে দুটি আচরণ হতে পারে: - কিছু ভাষা এবং অ্যাসিঙ্ক লাইব্রেরির সংমিশ্রণের জন্য, ফাংশন ফ্রেমওয়ার্ক অ্যাসিঙ্ক্রোনাসভাবে চলতে পারে এবং অবিলম্বে ফিরে আসতে পারে, যার ফলে কোডটি ব্যাকগ্রাউন্ডে চলতে থাকে, যা CPU অ্যাক্সেস করতে না পারার মতো সমস্যার কারণ হতে পারে। এটি এড়াতে, আপনাকে নীচে বর্ণিত হিসাবে মডিউল শুরুতে ব্লক করা উচিত। এটি নিশ্চিত করে যে সূচনা সম্পূর্ণ না হওয়া পর্যন্ত অনুরোধগুলি পরিবেশিত হবে না। - অন্য দিকে, যদি ইনিশিয়ালাইজেশন সিঙ্ক্রোনাস হয়, তাহলে দীর্ঘ ইনিশিয়ালাইজেশন সময় দীর্ঘ ঠান্ডা শুরু হবে, যা লোডের স্পাইকের সময় কম কনকারেন্সি ফাংশনগুলির সাথে একটি সমস্যা হতে পারে।

একটি async node.js লাইব্রেরি prewarming এর উদাহরণ

Firestore সহ Node.js হল async node.js লাইব্রেরির একটি উদাহরণ। min_instances সুবিধা নেওয়ার জন্য, নিম্নোক্ত কোডটি লোডের সময় লোডিং এবং আরম্ভ করা সম্পূর্ণ করে, মডিউল লোডিং ব্লক করে।

TLA ব্যবহার করা হয়, যার মানে ES6 প্রয়োজন, node.js কোডের জন্য একটি .mjs এক্সটেনশন ব্যবহার করে বা package.json ফাইলে type: module যোগ করা।

{
  "main": "main.js",
  "type": "module",
  "dependencies": {
    "@google-cloud/firestore": "^7.10.0",
    "@google-cloud/functions-framework": "^3.4.5"
  }
}
Node.js
import Firestore from '@google-cloud/firestore';
import * as functions from '@google-cloud/functions-framework';

const firestore = new Firestore({preferRest: true});

// Pre-warm firestore connection pool, and preload our global config
// document in cache. In order to ensure no other request comes in,
// block the module loading with a synchronous global request:
const config = await firestore.collection('collection').doc('config').get();

functions.http('fetch', (req, res) => {

// Do something with config and firestore client, which are now preloaded
// and will execute at lower latency.
});

গ্লোবাল ইনিশিয়ালাইজেশনের উদাহরণ

Node.js পাইথন
const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
  doUsualWork();
  if(unlikelyCondition()){
      myCostlyVariable = myCostlyVariable || buildCostlyVariable();
  }
  res.status(200).send('OK');
});
from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

এই HTTP ফাংশন অলসভাবে শুরু করা গ্লোবাল ব্যবহার করে। এটি একটি রিকোয়েস্ট অবজেক্ট ( flask.Request ) নেয় এবং প্রতিক্রিয়া টেক্সট বা মানগুলির যেকোন সেট ফেরত দেয় যা make_response ব্যবহার করে একটি Response অবজেক্টে পরিণত করা যেতে পারে।

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

অতিরিক্ত সম্পদ

"Google ক্লাউড পারফরম্যান্স অ্যাটলাস" ভিডিও Cloud Functions কোল্ড বুট টাইম- এ পারফরম্যান্স অপ্টিমাইজ করার বিষয়ে আরও জানুন।

,

এই দস্তাবেজটি Cloud Functions ডিজাইন, বাস্তবায়ন, পরীক্ষা এবং স্থাপনের জন্য সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

যথার্থতা

এই বিভাগটি Cloud Functions ডিজাইন এবং বাস্তবায়নের জন্য সাধারণ সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

অক্ষমতার ফাংশন লিখ

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

ব্যাকগ্রাউন্ড কার্যক্রম শুরু করবেন না

ব্যাকগ্রাউন্ড অ্যাক্টিভিটি হল আপনার ফাংশন বন্ধ হয়ে যাওয়ার পর যা ঘটে। একটি ফাংশন ইনভোকেশন শেষ হয়ে গেলে ফাংশন রিটার্ন করলে বা অন্যথায় সম্পূর্ণ হওয়ার সংকেত দেয়, যেমন Node.js ইভেন্ট-চালিত ফাংশনে callback আর্গুমেন্ট কল করে। সুন্দর সমাপ্তির পরে চালানো যেকোন কোড CPU অ্যাক্সেস করতে পারে না এবং কোনো অগ্রগতি করতে পারে না।

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

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

সর্বদা অস্থায়ী ফাইল মুছে দিন

অস্থায়ী ডিরেক্টরিতে স্থানীয় ডিস্ক স্টোরেজ একটি ইন-মেমরি ফাইল সিস্টেম। আপনি যে ফাইলগুলি লেখেন সেগুলি আপনার ফাংশনের জন্য উপলব্ধ মেমরি ব্যবহার করে এবং কখনও কখনও আহ্বানের মধ্যে টিকে থাকে। এই ফাইলগুলি স্পষ্টভাবে মুছে ফেলতে ব্যর্থ হলে শেষ পর্যন্ত মেমরির বাইরের ত্রুটি এবং পরবর্তী ঠান্ডা শুরু হতে পারে।

আপনি Google ক্লাউড কনসোলের ফাংশনের তালিকায় এটি নির্বাচন করে এবং মেমরি ব্যবহারের প্লট বেছে নিয়ে একটি পৃথক ফাংশন দ্বারা ব্যবহৃত মেমরি দেখতে পারেন।

আপনার যদি দীর্ঘমেয়াদী স্টোরেজ অ্যাক্সেসের প্রয়োজন হয়, Cloud Storage বা NFS ভলিউম সহ Cloud Run ভলিউম মাউন্ট ব্যবহার করার কথা বিবেচনা করুন।

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

ফাংশন ফ্রেমওয়ার্ক

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

এটি করার জন্য, প্রাসঙ্গিক লক ফাইলে আপনার পছন্দের সংস্করণটি অন্তর্ভুক্ত করুন (উদাহরণস্বরূপ, Node.js-এর জন্য package-lock.json , অথবা Python-এর জন্য requirements.txt )।

যদি ফাংশন ফ্রেমওয়ার্ক স্পষ্টভাবে একটি নির্ভরতা হিসাবে তালিকাভুক্ত না হয়, এটি সর্বশেষ উপলব্ধ সংস্করণ ব্যবহার করে বিল্ড প্রক্রিয়া চলাকালীন স্বয়ংক্রিয়ভাবে যোগ করা হবে।

টুলস

এই বিভাগটি Cloud Functions বাস্তবায়ন, পরীক্ষা এবং ইন্টারঅ্যাক্ট করার জন্য সরঞ্জামগুলি কীভাবে ব্যবহার করতে হয় তার নির্দেশিকা প্রদান করে৷

স্থানীয় উন্নয়ন

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

Firebase ডেভেলপাররা Firebase CLI Cloud Functions এমুলেটর ব্যবহার করতে পারেন।

আরম্ভ করার সময় স্থাপনার সময়সীমা এড়িয়ে চলুন

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

Firebase CLI-তে স্থাপনার সময় আপনার ফাংশনগুলি আবিষ্কার করার জন্য একটি ডিফল্ট সময়সীমা রয়েছে। যদি আপনার ফাংশনের সোর্স কোডে ইনিশিয়ালাইজেশন লজিক (মডিউল লোড করা, নেটওয়ার্ক কল করা ইত্যাদি) এই সময়সীমা অতিক্রম করে, তাহলে স্থাপনা ব্যর্থ হতে পারে।

সময়সীমা এড়াতে, নিম্নলিখিত কৌশলগুলির মধ্যে একটি ব্যবহার করুন:

স্থাপনার সময় ইনিশিয়ালাইজেশন কোড চালানো এড়াতে onInit() হুক ব্যবহার করুন। onInit() হুকের ভিতরের কোড তখনই চলবে যখন ফাংশনটি ক্লাউড রান ফাংশনে স্থাপন করা হবে, ডিপ্লয়মেন্ট প্রক্রিয়ার সময় নয়।

Node.js পাইথন
const { onInit } = require('firebase-functions/v2/core');
const { onRequest } = require('firebase-functions/v2/https');

// Example of a slow initialization task
function slowInitialization() {
  // Simulate a long-running operation (e.g., loading a large model, network request).
  return new Promise(resolve => {
      setTimeout(() => {
          console.log("Slow initialization complete");
          resolve("Initialized Value");
      }, 20000); // Simulate a 20-second delay
  });
}
let initializedValue;

onInit(async () => {
  initializedValue = await slowInitialization();
});

exports.myFunction = onRequest((req, res) => {
  // Access the initialized value. It will be ready after the first invocation.
  res.send(`Value: ${initializedValue}`);
});
from firebase_functions.core import init
from firebase_functions import https_fn
import time

# Example of a slow initialization task
def _slow_initialization():
  time.sleep(20)  # Simulate a 20-second delay
  print("Slow initialization complete")
  return "Initialized Value"

_initialized_value = None

@init
def initialize():
  global _initialized_value
  _initialized_value = _slow_initialization()

@https_fn.on_request()
def my_function(req: https_fn.Request) -> https_fn.Response:
  # Access the initialized value. It will be ready after the first invocation.
  return https_fn.Response(f"Value: {_initialized_value}")

(বিকল্প) আবিষ্কারের সময়সীমা বাড়ান

যদি আপনি onInit() ব্যবহার করার জন্য আপনার কোড রিফ্যাক্টর করতে না পারেন, তাহলে আপনি FUNCTIONS_DISCOVERY_TIMEOUT এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে CLI এর ডিপ্লয়মেন্ট টাইমআউট বাড়াতে পারেন:

$ export FUNCTIONS_DISCOVERY_TIMEOUT=30
$ firebase deploy --only functions

ইমেল পাঠাতে Sendgrid ব্যবহার করুন

Cloud Functions পোর্ট 25 এ আউটবাউন্ড সংযোগের অনুমতি দেয় না, তাই আপনি একটি SMTP সার্ভারে অ-সুরক্ষিত সংযোগ করতে পারবেন না। ইমেল পাঠানোর প্রস্তাবিত উপায় হল একটি তৃতীয় পক্ষের পরিষেবা যেমন SendGrid ব্যবহার করা। আপনি Google Compute Engine-এর জন্য একটি ইনস্ট্যান্স টিউটোরিয়াল থেকে পাঠানো ইমেল- এ ইমেল পাঠানোর জন্য অন্যান্য বিকল্প খুঁজে পেতে পারেন।

কর্মক্ষমতা

এই বিভাগে কর্মক্ষমতা অপ্টিমাইজ করার জন্য সর্বোত্তম অনুশীলন বর্ণনা করে।

কম সংগতি এড়িয়ে চলুন

যেহেতু কোল্ড স্টার্ট ব্যয়বহুল, একটি স্পাইকের সময় সম্প্রতি শুরু হওয়া দৃষ্টান্তগুলি পুনরায় ব্যবহার করতে সক্ষম হওয়া লোড পরিচালনা করার জন্য একটি দুর্দান্ত অপ্টিমাইজেশন। সীমিত সহগামীতা সীমিত করে কিভাবে বিদ্যমান দৃষ্টান্তগুলিকে লিভারেজ করা যায়, তাই আরও ঠান্ডা শুরু হয়।

ক্রমবর্ধমান সঙ্গতি প্রতি দৃষ্টান্তে একাধিক অনুরোধ স্থগিত করতে সাহায্য করে, লোডের স্পাইকগুলি পরিচালনা করা সহজ করে তোলে।

নির্ভরতাকে বুদ্ধিমানের সাথে ব্যবহার করুন

যেহেতু ফাংশন স্টেটলেস, এক্সিকিউশন এনভায়রনমেন্ট প্রায়শই স্ক্র্যাচ থেকে শুরু করা হয় ( কোল্ড স্টার্ট হিসাবে পরিচিত সময়)। যখন একটি ঠান্ডা শুরু হয়, তখন ফাংশনের বিশ্বব্যাপী প্রেক্ষাপট মূল্যায়ন করা হয়।

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

ভবিষ্যতের আহ্বানে বস্তুগুলিকে পুনরায় ব্যবহার করতে বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করুন

কোন গ্যারান্টি নেই যে একটি ফাংশনের অবস্থা ভবিষ্যতের আহ্বানের জন্য সংরক্ষণ করা হবে। যাইহোক, Cloud Functions প্রায়ই পূর্ববর্তী আহ্বানের কার্যকরী পরিবেশকে পুনর্ব্যবহার করে। আপনি যদি বৈশ্বিক সুযোগে একটি পরিবর্তনশীল ঘোষণা করেন, তাহলে এর মান পুনরায় গণনা না করেই পরবর্তী আহ্বানে পুনরায় ব্যবহার করা যেতে পারে।

এইভাবে আপনি বস্তুগুলি ক্যাশে করতে পারেন যা প্রতিটি ফাংশন আহ্বানে পুনরায় তৈরি করা ব্যয়বহুল হতে পারে। এই ধরনের বস্তুগুলিকে ফাংশন বডি থেকে গ্লোবাল স্কোপে স্থানান্তর করার ফলে উল্লেখযোগ্য কর্মক্ষমতা উন্নতি হতে পারে। নিম্নলিখিত উদাহরণটি প্রতি ফাংশন ইনস্ট্যান্সে শুধুমাত্র একবার একটি ভারী বস্তু তৈরি করে এবং প্রদত্ত উদাহরণে পৌঁছানো সমস্ত ফাংশন আহ্বান জুড়ে এটি ভাগ করে:

Node.js পাইথন
console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
  console.log('Function invocation');
  const perFunction = lightweightComputation();

  res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

এই HTTP ফাংশনটি একটি রিকোয়েস্ট অবজেক্ট ( flask.Request ) নেয় এবং রেসপন্স টেক্সট বা মানগুলির যেকোন সেট ফেরত দেয় যা make_response ব্যবহার করে Response অবজেক্টে পরিণত করা যায়।

গ্লোবাল স্কোপে নেটওয়ার্ক সংযোগ, লাইব্রেরি রেফারেন্স এবং API ক্লায়েন্ট অবজেক্ট ক্যাশে করা বিশেষভাবে গুরুত্বপূর্ণ। উদাহরণের জন্য নেটওয়ার্কিং অপ্টিমাইজ করা দেখুন।

ন্যূনতম সংখ্যক দৃষ্টান্ত সেট করে ঠান্ডা শুরু কম করুন

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

এই রানটাইম বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য নিয়ন্ত্রণ স্কেলিং আচরণ দেখুন।

কোল্ড স্টার্ট এবং ইনিশিয়ালাইজেশন সম্পর্কে নোট

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

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

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

আপনি যদি ভাষার উপর নির্ভর করে বৈশ্বিক পরিসরে ভেরিয়েবলগুলিকে আরম্ভ করেন, দীর্ঘ প্রারম্ভিক সময়ের ফলে দুটি আচরণ হতে পারে: - কিছু ভাষা এবং অ্যাসিঙ্ক লাইব্রেরির সংমিশ্রণের জন্য, ফাংশন ফ্রেমওয়ার্ক অ্যাসিঙ্ক্রোনাসভাবে চলতে পারে এবং অবিলম্বে ফিরে আসতে পারে, যার ফলে কোডটি ব্যাকগ্রাউন্ডে চলতে থাকে, যা CPU অ্যাক্সেস করতে না পারার মতো সমস্যার কারণ হতে পারে। এটি এড়াতে, আপনাকে নীচে বর্ণিত হিসাবে মডিউল শুরুতে ব্লক করা উচিত। এটি নিশ্চিত করে যে সূচনা সম্পূর্ণ না হওয়া পর্যন্ত অনুরোধগুলি পরিবেশিত হবে না। - অন্য দিকে, যদি ইনিশিয়ালাইজেশন সিঙ্ক্রোনাস হয়, তাহলে দীর্ঘ ইনিশিয়ালাইজেশন সময় দীর্ঘ ঠান্ডা শুরু হবে, যা লোডের স্পাইকের সময় কম কনকারেন্সি ফাংশনগুলির সাথে একটি সমস্যা হতে পারে।

একটি async node.js লাইব্রেরি prewarming এর উদাহরণ

Firestore সহ Node.js হল async node.js লাইব্রেরির একটি উদাহরণ। min_instances সুবিধা নেওয়ার জন্য, নিম্নোক্ত কোডটি লোডের সময় লোডিং এবং আরম্ভ করা সম্পূর্ণ করে, মডিউল লোডিং ব্লক করে।

TLA ব্যবহার করা হয়, যার মানে ES6 প্রয়োজন, node.js কোডের জন্য একটি .mjs এক্সটেনশন ব্যবহার করে বা package.json ফাইলে type: module যোগ করা।

{
  "main": "main.js",
  "type": "module",
  "dependencies": {
    "@google-cloud/firestore": "^7.10.0",
    "@google-cloud/functions-framework": "^3.4.5"
  }
}
Node.js
import Firestore from '@google-cloud/firestore';
import * as functions from '@google-cloud/functions-framework';

const firestore = new Firestore({preferRest: true});

// Pre-warm firestore connection pool, and preload our global config
// document in cache. In order to ensure no other request comes in,
// block the module loading with a synchronous global request:
const config = await firestore.collection('collection').doc('config').get();

functions.http('fetch', (req, res) => {

// Do something with config and firestore client, which are now preloaded
// and will execute at lower latency.
});

গ্লোবাল ইনিশিয়ালাইজেশনের উদাহরণ

Node.js পাইথন
const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
  doUsualWork();
  if(unlikelyCondition()){
      myCostlyVariable = myCostlyVariable || buildCostlyVariable();
  }
  res.status(200).send('OK');
});
from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

এই HTTP ফাংশন অলসভাবে শুরু করা গ্লোবাল ব্যবহার করে। এটি একটি রিকোয়েস্ট অবজেক্ট ( flask.Request ) নেয় এবং প্রতিক্রিয়া টেক্সট বা মানগুলির যেকোন সেট ফেরত দেয় যা make_response ব্যবহার করে একটি Response অবজেক্টে পরিণত করা যেতে পারে।

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

অতিরিক্ত সম্পদ

"Google ক্লাউড পারফরম্যান্স অ্যাটলাস" ভিডিও Cloud Functions কোল্ড বুট টাইম- এ পারফরম্যান্স অপ্টিমাইজ করার বিষয়ে আরও জানুন।

,

এই দস্তাবেজটি Cloud Functions ডিজাইন, বাস্তবায়ন, পরীক্ষা এবং স্থাপনের জন্য সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

যথার্থতা

এই বিভাগটি Cloud Functions ডিজাইন এবং বাস্তবায়নের জন্য সাধারণ সর্বোত্তম অনুশীলনগুলি বর্ণনা করে৷

অক্ষমতার ফাংশন লিখ

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

ব্যাকগ্রাউন্ড কার্যক্রম শুরু করবেন না

ব্যাকগ্রাউন্ড অ্যাক্টিভিটি হল আপনার ফাংশন বন্ধ হয়ে যাওয়ার পর যা ঘটে। একটি ফাংশন ইনভোকেশন শেষ হয়ে গেলে ফাংশন রিটার্ন করলে বা অন্যথায় সম্পূর্ণ হওয়ার সংকেত দেয়, যেমন Node.js ইভেন্ট-চালিত ফাংশনে callback আর্গুমেন্ট কল করে। সুন্দর সমাপ্তির পরে চালানো যেকোন কোড CPU অ্যাক্সেস করতে পারে না এবং কোনো অগ্রগতি করতে পারে না।

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

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

সর্বদা অস্থায়ী ফাইল মুছে দিন

অস্থায়ী ডিরেক্টরিতে স্থানীয় ডিস্ক স্টোরেজ একটি ইন-মেমরি ফাইল সিস্টেম। আপনি যে ফাইলগুলি লেখেন সেগুলি আপনার ফাংশনের জন্য উপলব্ধ মেমরি ব্যবহার করে এবং কখনও কখনও আহ্বানের মধ্যে টিকে থাকে। এই ফাইলগুলি স্পষ্টভাবে মুছে ফেলতে ব্যর্থ হলে শেষ পর্যন্ত মেমরির বাইরের ত্রুটি এবং পরবর্তী ঠান্ডা শুরু হতে পারে।

আপনি Google ক্লাউড কনসোলের ফাংশনের তালিকায় এটি নির্বাচন করে এবং মেমরি ব্যবহারের প্লট বেছে নিয়ে একটি পৃথক ফাংশন দ্বারা ব্যবহৃত মেমরি দেখতে পারেন।

আপনার যদি দীর্ঘমেয়াদী স্টোরেজ অ্যাক্সেসের প্রয়োজন হয়, Cloud Storage বা NFS ভলিউম সহ Cloud Run ভলিউম মাউন্ট ব্যবহার করার কথা বিবেচনা করুন।

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

ফাংশন ফ্রেমওয়ার্ক

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

এটি করার জন্য, প্রাসঙ্গিক লক ফাইলে আপনার পছন্দের সংস্করণটি অন্তর্ভুক্ত করুন (উদাহরণস্বরূপ, Node.js-এর জন্য package-lock.json , অথবা Python-এর জন্য requirements.txt )।

যদি ফাংশন ফ্রেমওয়ার্ক স্পষ্টভাবে একটি নির্ভরতা হিসাবে তালিকাভুক্ত না হয়, এটি সর্বশেষ উপলব্ধ সংস্করণ ব্যবহার করে বিল্ড প্রক্রিয়া চলাকালীন স্বয়ংক্রিয়ভাবে যোগ করা হবে।

টুলস

এই বিভাগটি Cloud Functions বাস্তবায়ন, পরীক্ষা এবং ইন্টারঅ্যাক্ট করার জন্য সরঞ্জামগুলি কীভাবে ব্যবহার করতে হয় তার নির্দেশিকা প্রদান করে৷

স্থানীয় উন্নয়ন

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

Firebase ডেভেলপাররা Firebase CLI Cloud Functions এমুলেটর ব্যবহার করতে পারেন।

আরম্ভ করার সময় স্থাপনার সময়সীমা এড়িয়ে চলুন

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

Firebase CLI-তে স্থাপনার সময় আপনার ফাংশনগুলি আবিষ্কার করার জন্য একটি ডিফল্ট সময়সীমা রয়েছে। যদি আপনার ফাংশনের সোর্স কোডে ইনিশিয়ালাইজেশন লজিক (মডিউল লোড করা, নেটওয়ার্ক কল করা ইত্যাদি) এই সময়সীমা অতিক্রম করে, তাহলে স্থাপনা ব্যর্থ হতে পারে।

সময়সীমা এড়াতে, নিম্নলিখিত কৌশলগুলির মধ্যে একটি ব্যবহার করুন:

স্থাপনার সময় ইনিশিয়ালাইজেশন কোড চালানো এড়াতে onInit() হুক ব্যবহার করুন। onInit() হুকের ভিতরের কোড তখনই চলবে যখন ফাংশনটি ক্লাউড রান ফাংশনে স্থাপন করা হবে, ডিপ্লয়মেন্ট প্রক্রিয়ার সময় নয়।

Node.js পাইথন
const { onInit } = require('firebase-functions/v2/core');
const { onRequest } = require('firebase-functions/v2/https');

// Example of a slow initialization task
function slowInitialization() {
  // Simulate a long-running operation (e.g., loading a large model, network request).
  return new Promise(resolve => {
      setTimeout(() => {
          console.log("Slow initialization complete");
          resolve("Initialized Value");
      }, 20000); // Simulate a 20-second delay
  });
}
let initializedValue;

onInit(async () => {
  initializedValue = await slowInitialization();
});

exports.myFunction = onRequest((req, res) => {
  // Access the initialized value. It will be ready after the first invocation.
  res.send(`Value: ${initializedValue}`);
});
from firebase_functions.core import init
from firebase_functions import https_fn
import time

# Example of a slow initialization task
def _slow_initialization():
  time.sleep(20)  # Simulate a 20-second delay
  print("Slow initialization complete")
  return "Initialized Value"

_initialized_value = None

@init
def initialize():
  global _initialized_value
  _initialized_value = _slow_initialization()

@https_fn.on_request()
def my_function(req: https_fn.Request) -> https_fn.Response:
  # Access the initialized value. It will be ready after the first invocation.
  return https_fn.Response(f"Value: {_initialized_value}")

(বিকল্প) আবিষ্কারের সময়সীমা বাড়ান

যদি আপনি onInit() ব্যবহার করার জন্য আপনার কোড রিফ্যাক্টর করতে না পারেন, তাহলে আপনি FUNCTIONS_DISCOVERY_TIMEOUT এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে CLI এর ডিপ্লয়মেন্ট টাইমআউট বাড়াতে পারেন:

$ export FUNCTIONS_DISCOVERY_TIMEOUT=30
$ firebase deploy --only functions

ইমেল পাঠাতে Sendgrid ব্যবহার করুন

Cloud Functions পোর্ট 25 এ আউটবাউন্ড সংযোগের অনুমতি দেয় না, তাই আপনি একটি SMTP সার্ভারে অ-সুরক্ষিত সংযোগ করতে পারবেন না। ইমেল পাঠানোর প্রস্তাবিত উপায় হল একটি তৃতীয় পক্ষের পরিষেবা যেমন SendGrid ব্যবহার করা। আপনি Google Compute Engine-এর জন্য একটি ইনস্ট্যান্স টিউটোরিয়াল থেকে পাঠানো ইমেল- এ ইমেল পাঠানোর জন্য অন্যান্য বিকল্প খুঁজে পেতে পারেন।

কর্মক্ষমতা

এই বিভাগে কর্মক্ষমতা অপ্টিমাইজ করার জন্য সর্বোত্তম অনুশীলন বর্ণনা করে।

কম সংগতি এড়িয়ে চলুন

যেহেতু কোল্ড স্টার্ট ব্যয়বহুল, একটি স্পাইকের সময় সম্প্রতি শুরু হওয়া দৃষ্টান্তগুলি পুনরায় ব্যবহার করতে সক্ষম হওয়া লোড পরিচালনা করার জন্য একটি দুর্দান্ত অপ্টিমাইজেশন। সীমিত সহগামীতা সীমিত করে কিভাবে বিদ্যমান দৃষ্টান্তগুলিকে লিভারেজ করা যায়, তাই আরও ঠান্ডা শুরু হয়।

ক্রমবর্ধমান সঙ্গতি প্রতি দৃষ্টান্তে একাধিক অনুরোধ স্থগিত করতে সাহায্য করে, লোডের স্পাইকগুলি পরিচালনা করা সহজ করে তোলে।

নির্ভরতাকে বুদ্ধিমানের সাথে ব্যবহার করুন

যেহেতু ফাংশন স্টেটলেস, এক্সিকিউশন এনভায়রনমেন্ট প্রায়শই স্ক্র্যাচ থেকে শুরু করা হয় ( কোল্ড স্টার্ট হিসাবে পরিচিত সময়)। যখন একটি ঠান্ডা শুরু হয়, তখন ফাংশনের বিশ্বব্যাপী প্রেক্ষাপট মূল্যায়ন করা হয়।

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

ভবিষ্যতের আহ্বানে বস্তুগুলিকে পুনরায় ব্যবহার করতে বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করুন

কোন গ্যারান্টি নেই যে একটি ফাংশনের অবস্থা ভবিষ্যতের আহ্বানের জন্য সংরক্ষণ করা হবে। যাইহোক, Cloud Functions প্রায়ই পূর্ববর্তী আহ্বানের কার্যকরী পরিবেশকে পুনর্ব্যবহার করে। আপনি যদি বৈশ্বিক সুযোগে একটি পরিবর্তনশীল ঘোষণা করেন, তাহলে এর মান পুনরায় গণনা না করেই পরবর্তী আহ্বানে পুনরায় ব্যবহার করা যেতে পারে।

এইভাবে আপনি বস্তুগুলি ক্যাশে করতে পারেন যা প্রতিটি ফাংশন আহ্বানে পুনরায় তৈরি করা ব্যয়বহুল হতে পারে। এই ধরনের বস্তুগুলিকে ফাংশন বডি থেকে গ্লোবাল স্কোপে স্থানান্তর করার ফলে উল্লেখযোগ্য কর্মক্ষমতা উন্নতি হতে পারে। নিম্নলিখিত উদাহরণটি প্রতি ফাংশন ইনস্ট্যান্সে শুধুমাত্র একবার একটি ভারী বস্তু তৈরি করে এবং প্রদত্ত উদাহরণে পৌঁছানো সমস্ত ফাংশন আহ্বান জুড়ে এটি ভাগ করে:

Node.js পাইথন
console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
  console.log('Function invocation');
  const perFunction = lightweightComputation();

  res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

এই HTTP ফাংশনটি একটি রিকোয়েস্ট অবজেক্ট ( flask.Request ) নেয় এবং রেসপন্স টেক্সট বা মানগুলির যেকোন সেট ফেরত দেয় যা make_response ব্যবহার করে Response অবজেক্টে পরিণত করা যায়।

গ্লোবাল স্কোপে নেটওয়ার্ক সংযোগ, লাইব্রেরি রেফারেন্স এবং API ক্লায়েন্ট অবজেক্ট ক্যাশে করা বিশেষভাবে গুরুত্বপূর্ণ। উদাহরণের জন্য নেটওয়ার্কিং অপ্টিমাইজ করা দেখুন।

ন্যূনতম সংখ্যক দৃষ্টান্ত সেট করে ঠান্ডা শুরু কম করুন

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

এই রানটাইম বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য নিয়ন্ত্রণ স্কেলিং আচরণ দেখুন।

কোল্ড স্টার্ট এবং ইনিশিয়ালাইজেশন সম্পর্কে নোট

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

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

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

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

একটি অ্যাসিঙ্ক নোড.জেএস লাইব্রেরির পূর্বনির্ধারিত উদাহরণ

ফায়ারস্টোর সহ নোড.জেএস অ্যাসিঙ্ক নোড.জেএস লাইব্রেরির একটি উদাহরণ। মিন_ইনস্ট্যান্সগুলির সুবিধা নেওয়ার জন্য, নিম্নলিখিত কোডটি লোড সময়ে লোডিং এবং সূচনা সম্পূর্ণ করে, মডিউল লোডিংকে অবরুদ্ধ করে।

টিএলএ ব্যবহার করা হয়, যার অর্থ ES6 প্রয়োজন, নোড.জেএস কোডের জন্য .mjs এক্সটেনশন ব্যবহার করে বা প্যাকেজ.জসন ফাইলে type: module যুক্ত করা।

{
  "main": "main.js",
  "type": "module",
  "dependencies": {
    "@google-cloud/firestore": "^7.10.0",
    "@google-cloud/functions-framework": "^3.4.5"
  }
}
Node.js
import Firestore from '@google-cloud/firestore';
import * as functions from '@google-cloud/functions-framework';

const firestore = new Firestore({preferRest: true});

// Pre-warm firestore connection pool, and preload our global config
// document in cache. In order to ensure no other request comes in,
// block the module loading with a synchronous global request:
const config = await firestore.collection('collection').doc('config').get();

functions.http('fetch', (req, res) => {

// Do something with config and firestore client, which are now preloaded
// and will execute at lower latency.
});

বৈশ্বিক সূচনার উদাহরণ

Node.js পাইথন
const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
  doUsualWork();
  if(unlikelyCondition()){
      myCostlyVariable = myCostlyVariable || buildCostlyVariable();
  }
  res.status(200).send('OK');
});
from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

এই এইচটিটিপি ফাংশনটি অলস-প্রাথমিক গ্লোবাল ব্যবহার করে। এটি একটি অনুরোধ অবজেক্ট ( flask.Request ) নেয় এবং প্রতিক্রিয়া পাঠ্য, বা মানগুলির যে কোনও সেট যা make_response ব্যবহার করে Response অবজেক্টে রূপান্তরিত হতে পারে এমন কোনও সেট দেয়।

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

অতিরিক্ত সম্পদ

"গুগল ক্লাউড পারফরম্যান্স অ্যাটলাস" ভিডিও Cloud Functions কোল্ড বুট সময়টিতে পারফরম্যান্স অনুকূলকরণের বিষয়ে আরও সন্ধান করুন।

,

এই দস্তাবেজটি Cloud Functions ডিজাইন, বাস্তবায়ন, পরীক্ষা এবং মোতায়েনের জন্য সর্বোত্তম অনুশীলনগুলি বর্ণনা করে।

যথার্থতা

এই বিভাগটি Cloud Functions ডিজাইন এবং বাস্তবায়নের জন্য সাধারণ সেরা অনুশীলনগুলি বর্ণনা করে।

আইডেমপোটেন্ট ফাংশন লিখুন

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

পটভূমি ক্রিয়াকলাপ শুরু করবেন না

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

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

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

সর্বদা অস্থায়ী ফাইল মুছুন

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

গুগল ক্লাউড কনসোলে ফাংশনগুলির তালিকায় এটি নির্বাচন করে এবং মেমরি ব্যবহারের প্লটটি বেছে নিয়ে আপনি কোনও পৃথক ফাংশন দ্বারা ব্যবহৃত মেমরিটি দেখতে পারেন।

আপনার যদি দীর্ঘমেয়াদী স্টোরেজ অ্যাক্সেসের প্রয়োজন হয় তবে Cloud Storage বা এনএফএস ভলিউম সহ Cloud Run ভলিউম মাউন্টগুলি ব্যবহার করার বিষয়টি বিবেচনা করুন।

পাইপলাইনিং ব্যবহার করে বৃহত্তর ফাইলগুলি প্রক্রিয়া করার সময় আপনি মেমরির প্রয়োজনীয়তা হ্রাস করতে পারেন। উদাহরণস্বরূপ, আপনি একটি পঠন স্ট্রিম তৈরি করে, একটি স্ট্রিম-ভিত্তিক প্রক্রিয়া দিয়ে পাস করে এবং ক্লাউড স্টোরেজে সরাসরি আউটপুট স্ট্রিম লিখে ক্লাউড স্টোরেজে একটি ফাইল প্রক্রিয়া করতে পারেন।

ফাংশন ফ্রেমওয়ার্ক

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

এটি করার জন্য, প্রাসঙ্গিক লক ফাইলে আপনার পছন্দসই সংস্করণটি অন্তর্ভুক্ত করুন (উদাহরণস্বরূপ, নোড.জেএসের জন্য package-lock.json , বা requirements.txt জন্য টেক্সট)।

যদি ফাংশন ফ্রেমওয়ার্ক স্পষ্টভাবে নির্ভরতা হিসাবে তালিকাভুক্ত না করা হয় তবে সর্বশেষতম উপলব্ধ সংস্করণটি ব্যবহার করে বিল্ড প্রক্রিয়া চলাকালীন এটি স্বয়ংক্রিয়ভাবে যুক্ত হবে।

টুলস

এই বিভাগটি কীভাবে Cloud Functions সাথে প্রয়োগ, পরীক্ষা এবং ইন্টারঅ্যাক্ট করার জন্য সরঞ্জামগুলি ব্যবহার করবেন সে সম্পর্কে নির্দেশিকা সরবরাহ করে।

স্থানীয় উন্নয়ন

ফাংশন স্থাপনা কিছুটা সময় নেয়, তাই স্থানীয়ভাবে আপনার ফাংশনের কোডটি পরীক্ষা করা প্রায়শই দ্রুত হয়।

ফায়ারবেস বিকাশকারীরা ফায়ারবেস সিএলআই Cloud Functions এমুলেটর ব্যবহার করতে পারে।

প্রারম্ভিককরণের সময় স্থাপনার সময়সীমা এড়িয়ে চলুন

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

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

সময়সীমা এড়াতে, নিম্নলিখিত কৌশলগুলির একটি ব্যবহার করুন:

স্থাপনার সময় ইনিশিয়ালাইজেশন কোড চালানো এড়াতে onInit() হুক ব্যবহার করুন। onInit() হুকের অভ্যন্তরের কোডটি কেবল তখনই চলবে যখন ফাংশনটি ক্লাউড রান ফাংশনগুলিতে স্থাপন করা হয়, নিজেই স্থাপনার প্রক্রিয়া চলাকালীন নয়।

Node.js পাইথন
const { onInit } = require('firebase-functions/v2/core');
const { onRequest } = require('firebase-functions/v2/https');

// Example of a slow initialization task
function slowInitialization() {
  // Simulate a long-running operation (e.g., loading a large model, network request).
  return new Promise(resolve => {
      setTimeout(() => {
          console.log("Slow initialization complete");
          resolve("Initialized Value");
      }, 20000); // Simulate a 20-second delay
  });
}
let initializedValue;

onInit(async () => {
  initializedValue = await slowInitialization();
});

exports.myFunction = onRequest((req, res) => {
  // Access the initialized value. It will be ready after the first invocation.
  res.send(`Value: ${initializedValue}`);
});
from firebase_functions.core import init
from firebase_functions import https_fn
import time

# Example of a slow initialization task
def _slow_initialization():
  time.sleep(20)  # Simulate a 20-second delay
  print("Slow initialization complete")
  return "Initialized Value"

_initialized_value = None

@init
def initialize():
  global _initialized_value
  _initialized_value = _slow_initialization()

@https_fn.on_request()
def my_function(req: https_fn.Request) -> https_fn.Response:
  # Access the initialized value. It will be ready after the first invocation.
  return https_fn.Response(f"Value: {_initialized_value}")

(বিকল্প) আবিষ্কারের সময়সীমা বাড়ান

আপনি যদি onInit() ব্যবহার করতে আপনার কোডটি রিফ্যাক্টর করতে না পারেন তবে আপনি FUNCTIONS_DISCOVERY_TIMEOUT এনভায়রনমেন্ট ভেরিয়েবলটি ব্যবহার করে সিএলআইয়ের স্থাপনার সময়সীমা বাড়িয়ে তুলতে পারেন:

$ export FUNCTIONS_DISCOVERY_TIMEOUT=30
$ firebase deploy --only functions

ইমেল প্রেরণে সেন্ডগ্রিড ব্যবহার করুন

Cloud Functions পোর্ট 25 এ আউটবাউন্ড সংযোগের অনুমতি দেয় না, তাই আপনি কোনও এসএমটিপি সার্ভারে অ-সুরক্ষিত সংযোগগুলি তৈরি করতে পারবেন না। ইমেল প্রেরণের প্রস্তাবিত উপায় হ'ল সেন্ডগ্রিডের মতো তৃতীয় পক্ষের পরিষেবা ব্যবহার করা। আপনি গুগল কম্পিউট ইঞ্জিনের জন্য একটি উদাহরণ টিউটোরিয়াল থেকে প্রেরণ ইমেল প্রেরণের জন্য অন্যান্য বিকল্পগুলি খুঁজে পেতে পারেন।

কর্মক্ষমতা

এই বিভাগটি কর্মক্ষমতা অনুকূলকরণের জন্য সেরা অনুশীলনগুলি বর্ণনা করে।

কম সম্মতি এড়িয়ে চলুন

যেহেতু ঠান্ডা শুরু ব্যয়বহুল, তাই সম্প্রতি স্পাইকের সময় পুনরায় ব্যবহার করতে সক্ষম হওয়া লোড হ্যান্ডেল করার জন্য দুর্দান্ত অপ্টিমাইজেশন। সম্মিলিত সীমাবদ্ধতা সীমাবদ্ধ করে বিদ্যমান উদাহরণগুলি কীভাবে লাভবান হতে পারে, তাই আরও শীতল শুরু হয়।

সম্মতি বাড়ানো উদাহরণ প্রতি একাধিক অনুরোধ স্থগিত করতে সহায়তা করে, লোডের স্পাইকগুলি পরিচালনা করা সহজ করে তোলে।

বিজ্ঞতার সাথে নির্ভরতা ব্যবহার করুন

যেহেতু ফাংশনগুলি রাষ্ট্রহীন, কার্যকরকরণের পরিবেশটি প্রায়শই স্ক্র্যাচ থেকে শুরু করা হয় (যা শীতল সূচনা হিসাবে পরিচিত)। যখন একটি ঠান্ডা শুরু হয়, তখন ফাংশনের বৈশ্বিক প্রসঙ্গটি মূল্যায়ন করা হয়।

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

ভবিষ্যতের আমন্ত্রণগুলিতে অবজেক্টগুলি পুনরায় ব্যবহার করতে গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করুন

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

এইভাবে আপনি প্রতিটি ফাংশন অনুরোধে পুনরায় তৈরি করতে ব্যয়বহুল হতে পারে এমন অবজেক্টগুলি ক্যাশে করতে পারেন। ফাংশন বডি থেকে বৈশ্বিক সুযোগে এই জাতীয় অবজেক্টগুলি সরিয়ে নেওয়ার ফলে উল্লেখযোগ্য পারফরম্যান্সের উন্নতি হতে পারে। নিম্নলিখিত উদাহরণটি প্রতি ফাংশন উদাহরণে একবারে একটি ভারী বস্তু তৈরি করে এবং প্রদত্ত উদাহরণে পৌঁছানো সমস্ত ফাংশন আমন্ত্রণগুলিতে এটি ভাগ করে দেয়:

Node.js পাইথন
console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
  console.log('Function invocation');
  const perFunction = lightweightComputation();

  res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});
import time

from firebase_functions import https_fn

# Placeholder
def heavy_computation():
  return time.time()

# Placeholder
def light_computation():
  return time.time()

# Global (instance-wide) scope
# This computation runs at instance cold-start
instance_var = heavy_computation()

@https_fn.on_request()
def scope_demo(request):

  # Per-function scope
  # This computation runs every time this function is called
  function_var = light_computation()
  return https_fn.Response(f"Instance: {instance_var}; function: {function_var}")
  

এই এইচটিটিপি ফাংশনটি একটি অনুরোধ অবজেক্ট ( flask.Request ) নেয় এবং প্রতিক্রিয়া পাঠ্য বা কোনও মান সেট করে যা make_response ব্যবহার করে কোনও Response অবজেক্টে রূপান্তরিত হতে পারে।

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

ন্যূনতম সংখ্যক উদাহরণ সেট করে ঠান্ডা শুরু করুন

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

এই রানটাইম বিকল্পগুলি সম্পর্কে আরও তথ্যের জন্য নিয়ন্ত্রণ স্কেলিং আচরণ দেখুন।

ঠান্ডা শুরু এবং সূচনা সম্পর্কে নোট

বিশ্বব্যাপী সূচনা লোড সময়ে ঘটে। এটি ব্যতীত, প্রথম অনুরোধটির সূচনাটি সম্পূর্ণ করতে হবে এবং মডিউলগুলি লোড করা দরকার, যার ফলে উচ্চতর বিলম্ব হয়।

তবে, বিশ্বব্যাপী সূচনাও শীতল সূচনায় প্রভাব ফেলে। এই প্রভাবটি হ্রাস করার জন্য, প্রথম অনুরোধের জন্য প্রথম অনুরোধের বিলম্বকে যতটা সম্ভব কম রাখতে কেবল প্রথম অনুরোধের জন্য যা প্রয়োজন তা শুরু করুন।

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

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

একটি অ্যাসিঙ্ক নোড.জেএস লাইব্রেরির পূর্বনির্ধারিত উদাহরণ

ফায়ারস্টোর সহ নোড.জেএস অ্যাসিঙ্ক নোড.জেএস লাইব্রেরির একটি উদাহরণ। মিন_ইনস্ট্যান্সগুলির সুবিধা নেওয়ার জন্য, নিম্নলিখিত কোডটি লোড সময়ে লোডিং এবং সূচনা সম্পূর্ণ করে, মডিউল লোডিংকে অবরুদ্ধ করে।

টিএলএ ব্যবহার করা হয়, যার অর্থ ES6 প্রয়োজন, নোড.জেএস কোডের জন্য .mjs এক্সটেনশন ব্যবহার করে বা প্যাকেজ.জসন ফাইলে type: module যুক্ত করা।

{
  "main": "main.js",
  "type": "module",
  "dependencies": {
    "@google-cloud/firestore": "^7.10.0",
    "@google-cloud/functions-framework": "^3.4.5"
  }
}
Node.js
import Firestore from '@google-cloud/firestore';
import * as functions from '@google-cloud/functions-framework';

const firestore = new Firestore({preferRest: true});

// Pre-warm firestore connection pool, and preload our global config
// document in cache. In order to ensure no other request comes in,
// block the module loading with a synchronous global request:
const config = await firestore.collection('collection').doc('config').get();

functions.http('fetch', (req, res) => {

// Do something with config and firestore client, which are now preloaded
// and will execute at lower latency.
});

বৈশ্বিক সূচনার উদাহরণ

Node.js পাইথন
const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
  doUsualWork();
  if(unlikelyCondition()){
      myCostlyVariable = myCostlyVariable || buildCostlyVariable();
  }
  res.status(200).send('OK');
});
from firebase_functions import https_fn

# Always initialized (at cold-start)
non_lazy_global = file_wide_computation()

# Declared at cold-start, but only initialized if/when the function executes
lazy_global = None

@https_fn.on_request()
def lazy_globals(request):

  global lazy_global, non_lazy_global

  # This value is initialized only if (and when) the function is called
  if not lazy_global:
      lazy_global = function_specific_computation()

  return https_fn.Response(f"Lazy: {lazy_global}, non-lazy: {non_lazy_global}.")
  

এই এইচটিটিপি ফাংশনটি অলস-প্রাথমিক গ্লোবাল ব্যবহার করে। এটি একটি অনুরোধ অবজেক্ট ( flask.Request ) নেয় এবং প্রতিক্রিয়া পাঠ্য, বা মানগুলির যে কোনও সেট যা make_response ব্যবহার করে Response অবজেক্টে রূপান্তরিত হতে পারে এমন কোনও সেট দেয়।

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

অতিরিক্ত সম্পদ

"গুগল ক্লাউড পারফরম্যান্স অ্যাটলাস" ভিডিও Cloud Functions কোল্ড বুট সময়টিতে পারফরম্যান্স অনুকূলকরণের বিষয়ে আরও সন্ধান করুন।