এই ডকুমেন্ট বর্ণনা করে যে কীভাবে আপনি অ্যাসিঙ্ক্রোনাস (নন-HTTPS) ব্যাকগ্রাউন্ড ফাংশনকে ব্যর্থ হলে আবার চেষ্টা করার জন্য অনুরোধ করতে পারেন।
ইভেন্ট-ড্রিভেন ফাংশন কেন সম্পূর্ণ হয় না
খুব কম ক্ষেত্রে, ইন্টার্নাল সমস্যার কারণে কোনও ফাংশন অসম্পূর্ণ অবস্থায় বেরিয়ে আসতে পারে, এবং ডিফল্ট হিসেবে ফাংশনটি অটোমেটিক আবার চেষ্টা করা হতেও পারে বা নাও হতে পারে।
আরও সাধারণভাবে, কোনও ইভেন্ট-ড্রিভেন ফাংশন, ফাংশন কোডে হওয়া সমস্যার কারণে সফলভাবে সম্পূর্ণ হতে পারে না। এইসব কারণে এটি হতে পারে:
- ফাংশনে একটি বাগ আছে এবং রানটাইম একটি ব্যতিক্রম দেখায়।
- ফাংশনটি কোনও পরিষেবা এন্ডপয়েন্টে পৌঁছাতে পারছে না অথবা পৌঁছানোর চেষ্টা করার সময় টাইম-আউট হয়ে যাচ্ছে।
- ফাংশনটি ইচ্ছাকৃতভাবে একটি ব্যতিক্রম তৈরি করে (যেমন, কোনও প্যারামিটার যাচাইকরণে ব্যর্থ হলে)।
- Node.js ফাংশন একটি বাতিল করা প্রমিস রিটার্ন করে অথবা কলব্যাকে
nullনয় এমন ভ্যালু পাস করে।
উপরের যেকোনও ক্ষেত্রে, ফাংশনটি এক্সিকিউট করা বন্ধ করে দেবে এবং একটি সমস্যা রিটার্ন করবে। যেসব ইভেন্ট ট্রিগার মেসেজ তৈরি করে, সেগুলির রিট্রাই নীতি আছে যা আপনি কাস্টমাইজ করতে পারেন যাতে আপনার ফাংশনের প্রয়োজন পূরণ হয়।
আবার চেষ্টা করার সেম্যান্টিক
Cloud Functions ইভেন্ট সোর্সের মাধ্যমে নির্গত প্রতিটি ইভেন্টের জন্য ইভেন্ট-পরিচালিত ফাংশনের অন্তত একবার এক্সিকিউশন প্রদান করে। সাধারণত, কোনও ফাংশন ইনভোকেশন কোনও সমস্যার কারণে বন্ধ হয়ে গেলে, ফাংশনটি আর ইনভোক করা হয় না এবং ইভেন্টটি বাদ দেওয়া হয়। আপনি কোনও ইভেন্ট-ড্রিভেন ফাংশনে আবার চেষ্টা করার সুবিধা চালু করলে, Cloud Functions কোনও ফাংশন ইনভোকেশন সফলভাবে সম্পূর্ণ না হওয়া পর্যন্ত অথবা আবার চেষ্টা করার উইন্ডো শেষ না হওয়া পর্যন্ত আবার চেষ্টা করে।
কোনও ফাংশনের জন্য আবার চেষ্টা করার সুবিধা চালু না থাকলে, যা হল ডিফল্ট, ফাংশনটি
সর্বদা রিপোর্ট করে যে এটি সফলভাবে এক্সিকিউট করা হয়েছে এবং 200 OK রেসপন্স কোড এর লগে
দেখা যেতে পারে। ফাংশনে কোনও সমস্যা হলেও এটি ঘটে। আপনার ফাংশনে কোনও সমস্যা হলে তা যাতে স্পষ্টভাবে বোঝা যায়, সেই জন্য
সমস্যার রিপোর্ট
যথাযথভাবে করতে ভুলবেন না।
আপনার ফাংশন কোড থেকে আবার চেষ্টা করার সুবিধা কনফিগার করা
Cloud Functions for Firebase-এর সাহায্যে, আপনি কোনও
ফাংশনের জন্য কোডে আবার চেষ্টা করার সুবিধা চালু করতে পারবেন। নতুন
Firestore ডকুমেন্ট তৈরি করার মতো ব্যাকগ্রাউন্ড ইভেন্টের জন্য এটি করতে, failurePolicy (1st gen) বা retry
নীতি (2nd gen) বিকল্প true হিসেবে সেট করুন:
1st gen
exports.docCreated = functions
.runWith({
// retry on failure
failurePolicy: true,
})
.firestore.document("my-collection/{docId}")
.onCreate((change, context) => {
/* ... */
});
2nd gen
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;
}
Promises-এর সাথে catch ব্যবহার করা
আপনার ফাংশনে আবার চেষ্টা করার সুবিধা চালু করা থাকলে, কোনও আনহ্যান্ডেলড সমস্যা আবার চেষ্টা করার প্রসেসকে ট্রিগার করবে। আবার চেষ্টা করার প্রয়োজন নেই এমন কোনও সমস্যা আপনার কোড ক্যাপচার করছে কিনা তা নিশ্চিত করুন।
আপনার কী করা উচিত তার একটি উদাহরণ এখানে দেওয়া হল:
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 ব্যর্থতা ম্যানেজ করা সংক্রান্ত ডকুমেন্টেশন দেখুন।