এই ডকুমেন্ট থেকে আপনি জানতে পারবেন যে কীভাবে অ্যাসিঙ্ক্রোনাস (নন-HTTPS) ব্যাকগ্রাউন্ড ফাংশন ব্যর্থ হলে আবার চেষ্টা করার অনুরোধ করতে হয়।
ইভেন্ট-চালিত ফাংশন কেন সম্পূর্ণ হয় না
খুব কম ক্ষেত্রে, ইন্টার্নাল সমস্যার কারণে কোনও ফাংশন সময়ের আগেই বন্ধ হয়ে যেতে পারে, এবং ডিফল্ট হিসেবে ফাংশনটি অটোমেটিক আবার চেষ্টা করতে পারে বা নাও করতে পারে।
আরও নির্দিষ্টভাবে, ফাংশন কোডে সমস্যার কারণে ইভেন্ট-চালিত ফাংশন সম্পূর্ণ নাও হতে পারে। এটি হওয়ার সম্ভাব্য কারণের মধ্যে রয়েছে:
- ফাংশনে সমস্যা আছে এবং রানটাইম ব্যতিক্রম দেখায়।
- ফাংশনটি কোনও পরিষেবা এন্ডপয়েন্টে পৌঁছাতে পারে না বা এটি করার চেষ্টা করার সময় সময় শেষ হয়ে যায়।
- ফাংশনটি ইচ্ছাকৃতভাবে একটি ব্যতিক্রম দেখায় (যেমন, যখন কোনও প্যারামিটার যাচাইকরণে ব্যর্থ হয়)।
- Node.js ফাংশন একটি প্রত্যাখ্যাত প্রমিস রিটার্ন করে বা একটি নন-
nullভ্যালু কলব্যাকে পাস করে।
উপরে উল্লেখ করা যেকোনও ক্ষেত্রে, ফাংশনটি কাজ করা বন্ধ করে দেবে এবং একটি সমস্যা দেখাবে। মেসেজ তৈরি করা ইভেন্ট ট্রিগারে আবার চেষ্টা করার নীতি আছে যা আপনি নিজের ফাংশনের প্রয়োজন মেটাতে কাস্টমাইজ করতে পারেন।
আবার চেষ্টা করার শব্দার্থবিদ্যা
Cloud Functions ইভেন্ট সোর্স থেকে নির্গত প্রতিটি ইভেন্টের জন্য ইভেন্ট-চালিত ফাংশনের অন্তত একবার এক্সিকিউশন প্রদান করে। ডিফল্ট হিসেবে, কোনও ফাংশন ইনভোকেশন কোনও সমস্যার কারণে বন্ধ হয়ে গেলে, ফাংশনটি আবার ইনভোক করা হয় না এবং ইভেন্টটি ড্রপ করা হয়। আপনি কোনও ইভেন্ট-চালিত ফাংশনে আবার চেষ্টা করার বিকল্প চালু করলে, Cloud Functions কোনও ব্যর্থ ফাংশন ইনভোকেশন সম্পূর্ণ না হওয়া পর্যন্ত বা আবার চেষ্টা করার উইন্ডোর মেয়াদ শেষ না হওয়া পর্যন্ত আবার চেষ্টা করে।
কোনও ফাংশনের জন্য আবার চেষ্টা করার বিকল্প চালু না থাকলে, যা ডিফল্ট হিসেবে থাকে, ফাংশনটি
সবসময় রিপোর্ট করে যে এটি সফলভাবে কার্যকর হয়েছে এবং এর লগে 200 OK রেসপন্স কোড
দেখা যেতে পারে। ফাংশনে কোনও সমস্যা হলেও এটি ঘটে। আপনার ফাংশনে কোনও সমস্যা হলে তা স্পষ্টভাবে জানাতে, সমস্যার রিপোর্ট
সঠিকভাবে করতে ভুলবেন না।
আপনার ফাংশন কোড থেকে আবার চেষ্টা করার প্রসেস কনফিগার করুন
Cloud Functions for Firebase-এর মাধ্যমে, আপনি কোনও ফাংশনের জন্য কোডে আবার চেষ্টা করার সুবিধা চালু করতে পারবেন। নতুন Firestore ডকুমেন্ট তৈরি করার মতো ব্যাকগ্রাউন্ড ইভেন্টের জন্য এটি করতে, failurePolicy (ফার্স্ট জেনারেশন) বা retry
নীতি (সেকেন্ড জেনারেশন) বিকল্প true-এ সেট করুন:
ফার্স্ট জেনারেশন
exports.docCreated = functions
.runWith({
// retry on failure
failurePolicy: true,
})
.firestore.document("my-collection/{docId}")
.onCreate((change, context) => {
/* ... */
});
সেকেন্ড জেনারেশন
const { onDocumentCreated } = require("firebase-functions/firestore");
exports.docCreated = onDocumentCreated(
{
// retry on failure
retry: true,
},
"my-collection/{docId}",
(event) => {
/* ... */
},
);
true-কে দেখানো অনুযায়ী সেট করলে, কোনও ফাংশন ব্যর্থ হলে সেটি আবার চেষ্টা করার জন্য কনফিগার করা হয়।
উইন্ডো আবার চেষ্টা করুন
২য় জেনারেশন ফাংশনের জন্য, এই আবার চেষ্টা করার উইন্ডোর মেয়াদ ২৪ ঘণ্টা পরে শেষ হয়ে যায়। ফার্স্ট জেনারেশন ফাংশনের ক্ষেত্রে, ৭ দিন পরে এটির মেয়াদ শেষ হয়ে যায়। Cloud Functions এক্সপোনেনশিয়াল ব্যাকঅফ স্ট্র্যাটেজি ব্যবহার করে নতুন তৈরি করা ইভেন্ট-চালিত ফাংশন আবার চেষ্টা করে, যেখানে ব্যাকঅফ ১০ থেকে ৬০০ সেকেন্ডের মধ্যে বৃদ্ধি পায়। আপনি প্রথমবার নতুন ফাংশন ডিপ্লয় করলে এই নীতি প্রয়োগ করা হয়। এই রিলিজ নোট-এ বর্ণিত পরিবর্তনগুলি কার্যকর হওয়ার আগে প্রথমবার ডিপ্লয় করা বিদ্যমান ফাংশনগুলিতে এটি রেট্রোঅ্যাক্টিভভাবে প্রয়োগ করা হয় না, এমনকি আপনি ফাংশনগুলি পুনরায় ডিপ্লয় করলেও।পেশাদার পদ্ধতি
এই বিভাগে আবার চেষ্টা করার পেশাদার পদ্ধতি সম্পর্কে বর্ণনা করা হয়েছে।
সাময়িক সমস্যা ম্যানেজ করতে আবার চেষ্টা করুন
যেহেতু আপনার ফাংশনটি সফলভাবে কার্যকর না হওয়া পর্যন্ত ক্রমাগত আবার চেষ্টা করা হয়, তাই আবার চেষ্টা করার বিকল্প চালু করার আগে পরীক্ষার মাধ্যমে আপনার কোড থেকে বাগগুলির মতো স্থায়ী ত্রুটিগুলি দূর করা উচিত। আবার চেষ্টা করার বিকল্পটি মাঝে মাঝে বা ক্ষণস্থায়ী ব্যর্থতাগুলি ম্যানেজ করার জন্য সবচেয়ে ভাল ব্যবহার করা হয় যেগুলি আবার চেষ্টা করার পরে সমাধান হওয়ার সম্ভাবনা বেশি থাকে, যেমন একটি ফ্ল্যাকি পরিষেবা এন্ডপয়েন্ট বা টাইমআউট।
অসীম সংখ্যক বার আবার চেষ্টা করার লুপ এড়াতে শেষ হওয়ার শর্ত সেট করুন
আবার চেষ্টা করার সময় আপনার ফাংশনকে ক্রমাগত লুপ করা থেকে রক্ষা করা সবচেয়ে ভালো অভ্যাস। ফাংশন প্রসেস করা শুরু করার আগে, আপনি একটি সুনির্দিষ্ট শেষ হওয়ার শর্ত অন্তর্ভুক্ত করে এটি করতে পারেন। মনে রাখবেন, এই টেকনিক তখনই কাজ করে যখন আপনার ফাংশন সফলভাবে শুরু হয় এবং শেষ কন্ডিশন মূল্যায়ন করতে পারে।
একটি সহজ অথচ কার্যকর পদ্ধতি হল নির্দিষ্ট সময়ের চেয়ে পুরনো টাইমস্ট্যাম্প সহ ইভেন্ট বাতিল করা। এটি ব্যর্থতাগুলি ক্রমাগত বা প্রত্যাশার চেয়ে দীর্ঘস্থায়ী হলে অতিরিক্ত এক্সিকিউশন এড়াতে সাহায্য করে।
যেমন, এই কোড স্নিপেট ১০ সেকেন্ডের বেশি পুরনো সব ইভেন্ট বাতিল করে দেয়:
const eventAgeMs = Date.now() - Date.parse(event.timestamp);
const eventMaxAgeMs = 10000;
if (eventAgeMs > eventMaxAgeMs) {
console.log(`Dropping event ${event} with age[ms]: ${eventAgeMs}`);
callback();
return;
}
catch-এর সাথে Promises ব্যবহার করা
আপনার ফাংশনে আবার চেষ্টা করার সুবিধা চালু থাকলে, কোনও হ্যান্ডেল না করা সমস্যার কারণে আবার চেষ্টা করার সুবিধা ট্রিগার হবে। আপনার কোড যেন এমন কোনও সমস্যা ক্যাপচার করে যা আবার চেষ্টা করার কারণ না হয়।
আপনার কী করা উচিত তার একটি উদাহরণ এখানে দেওয়া হল:
return doFooAsync().catch((err) => {
if (isFatal(err)) {
console.error(`Fatal error ${err}`);
}
return Promise.reject(err);
});
আবার চেষ্টা করা যায় এমন ইভেন্ট-চালিত ফাংশন আইডেমপোটেন্ট করুন
ইভেন্ট-চালিত ফাংশন যা আবার চেষ্টা করা যেতে পারে তা অবশ্যই আইডেমপোটেন্ট হতে হবে। এই ধরনের ফাংশন আইডেমপোটেন্ট করার জন্য এখানে কিছু সাধারণ নির্দেশিকা দেওয়া হল:
- অনেক এক্সটার্নাল API (যেমন Stripe) আপনাকে প্যারামিটার হিসেবে আইডেমপোটেন্সি কী প্রদান করতে দেয়। আপনি এই ধরনের API ব্যবহার করলে, ইভেন্ট আইডিকে আইডেমপোটেন্সি কী হিসেবে ব্যবহার করা উচিত।
- আইডেমপোটেন্সি অন্তত একবার ডেলিভারির ক্ষেত্রে ভাল কাজ করে, কারণ এটি আবার চেষ্টা করাকে নিরাপদ করে তোলে। তাই, নির্ভরযোগ্য কোড লেখার জন্য একটি সাধারণ পেশাদার পদ্ধতি হল আইডেমপোটেন্সির সাথে রিট্রাই করার সুবিধা একত্রিত করা।
- আপনার কোড ইন্টার্নালি আইডেমপোটেন্ট কিনা তা ভাল করে দেখে নিন। যেমন:
- নিশ্চিত করুন যে ফলাফল পরিবর্তন না করেই মিউটেশন একাধিকবার ঘটতে পারে।
- স্টেট মিউটেট করার আগে ট্রানজ্যাকশনে ডেটাবেস স্টেট কোয়েরি করুন।
- নিশ্চিত করুন যে সব সাইড এফেক্ট যেন আইডেমপোটেন্ট হয়।
- ফাংশনের বাইরে, কোড থেকে স্বাধীনভাবে একটি ট্রানজ্যাকশন চেক আরোপ করুন। যেমন, কোনও একটি ইভেন্ট আইডি যে আগে থেকেই প্রসেস করা হয়েছে, সেই তথ্য কোথাও রেকর্ড করে রাখুন।
- আউট-অফ-ব্যান্ড ডুপ্লিকেট ফাংশন কল সংক্রান্ত সমস্যার সমাধান করুন। যেমন, ডুপ্লিকেট ফাংশন কলের পরে ক্লিন আপ করার জন্য আলাদা ক্লিন আপ প্রসেস ব্যবহার করুন।
আবার চেষ্টা করার নীতি কনফিগার করুন
আপনার ফাংশনের প্রয়োজনীয়তার উপর নির্ভর করে, আপনি সরাসরি আবার চেষ্টা করার নীতি কনফিগার করতে চাইতে পারেন। এটি আপনাকে নিম্নলিখিত বিকল্পগুলির যেকোনও কম্বিনেশন সেট-আপ করার অনুমতি দেবে:
- আবার চেষ্টা করার উইন্ডো ৭ দিন থেকে কমিয়ে ১০ মিনিট পর্যন্ত করা।
- এক্সপোনেনশিয়াল ব্যাকঅফ রিট্রাই স্ট্র্যাটেজির জন্য ন্যূনতম ও সর্বাধিক ব্যাকঅফ সময় পরিবর্তন করুন।
- অবিলম্বে আবার চেষ্টা করার জন্য আবার চেষ্টা করার স্ট্র্যাটেজি পরিবর্তন করুন।
- ডেড-লেটার টপিক কনফিগার করুন।
- ডেলিভারি করার জন্য সর্বাধিক ও সর্বনিম্ন কতবার চেষ্টা করা হবে তা সেট করুন।
আবার চেষ্টা করার নীতি কনফিগার করতে:
- একটি HTTP ফাংশন লিখুন।
- Pub/Sub সাবস্ক্রিপশন তৈরি করতে Pub/Sub API ব্যবহার করুন, টার্গেট হিসেবে ফাংশনের URL উল্লেখ করুন।
সরাসরি Pub/Sub কনফিগার করার ব্যাপারে আরও তথ্যের জন্য Pub/Sub-এর ব্যর্থতা ম্যানেজ করা সংক্রান্ত ডকুমেন্টেশন দেখুন।