এই দস্তাবেজটি 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 এমুলেটর ব্যবহার করতে পারেন।ইমেল পাঠাতে 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 ক্লায়েন্ট অবজেক্ট ক্যাশে করা বিশেষভাবে গুরুত্বপূর্ণ। উদাহরণের জন্য নেটওয়ার্কিং অপ্টিমাইজ করা দেখুন।
গ্লোবাল ভেরিয়েবলের অলস সূচনা করুন
আপনি যদি বৈশ্বিক সুযোগে ভেরিয়েবল শুরু করেন, তাহলে ইনিশিয়ালাইজেশন কোডটি সর্বদা একটি কোল্ড স্টার্ট ইনভোকেশনের মাধ্যমে কার্যকর করা হবে, আপনার ফাংশনের লেটেন্সি বাড়িয়ে দেবে। কিছু কিছু ক্ষেত্রে, এটি একটি try
/ catch
ব্লকে যথাযথভাবে পরিচালনা না করা হলে কল করা পরিষেবাগুলির মাঝে মাঝে টাইমআউট হয়ে যায়। যদি কিছু অবজেক্ট সমস্ত কোড পাথে ব্যবহার না করা হয়, তাহলে চাহিদা অনুযায়ী অলসভাবে শুরু করার কথা বিবেচনা করুন:
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 কোল্ড বুট টাইম- এ পারফরম্যান্স অপ্টিমাইজ করার বিষয়ে আরও জানুন।