এই ডকুমেন্টে বর্ণনা করা হয়েছে যে কীভাবে আপনি ব্যর্থতার পরে পুনরায় চেষ্টা করার জন্য অ্যাসিঙ্ক্রোনাস (নন-HTTPS) ব্যাকগ্রাউন্ড ফাংশনগুলির অনুরোধ করতে পারেন।
ইভেন্ট-চালিত ফাংশনগুলি কেন সম্পূর্ণ হতে ব্যর্থ হয়
বিরল ক্ষেত্রে, কোনও অভ্যন্তরীণ ত্রুটির কারণে কোনও ফাংশন অকালেই বেরিয়ে যেতে পারে এবং ডিফল্টরূপে ফাংশনটি স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করা হতে পারে বা নাও হতে পারে।
সাধারণত, ফাংশন কোডে থাকা ত্রুটির কারণে একটি ইভেন্ট-চালিত ফাংশন সফলভাবে সম্পূর্ণ করতে ব্যর্থ হতে পারে। এটি হওয়ার কারণগুলির মধ্যে রয়েছে:
- ফাংশনটিতে একটি বাগ রয়েছে এবং রানটাইম একটি ব্যতিক্রম ছুঁড়ে দেয়।
- ফাংশনটি কোনও পরিষেবার শেষ বিন্দুতে পৌঁছাতে পারে না, অথবা এটি করার চেষ্টা করার সময় সময় শেষ হয়ে যায়।
- ফাংশনটি ইচ্ছাকৃতভাবে একটি ব্যতিক্রম ছুঁড়ে দেয় (উদাহরণস্বরূপ, যখন একটি প্যারামিটার যাচাইকরণ ব্যর্থ হয়)।
- একটি Node.js ফাংশন একটি প্রত্যাখ্যাত প্রতিশ্রুতি প্রদান করে, অথবা একটি কলব্যাকে একটি অ-
null
মান পাস করে।
উপরের যেকোনো ক্ষেত্রে, ফাংশনটি কার্যকর করা বন্ধ করে দেবে এবং একটি ত্রুটি ফিরিয়ে দেবে। ইভেন্ট ট্রিগারগুলি বার্তা তৈরি করে, যার মধ্যে পুনরায় চেষ্টা করার নীতি রয়েছে যা আপনি আপনার ফাংশনের চাহিদা পূরণের জন্য কাস্টমাইজ করতে পারেন।
পুনঃপ্রচেষ্টার শব্দার্থবিদ্যা
Cloud Functions একটি ইভেন্ট সোর্স দ্বারা নির্গত প্রতিটি ইভেন্টের জন্য কমপক্ষে একবার ইভেন্ট-চালিত ফাংশনের সম্পাদনা প্রদান করে। ডিফল্টরূপে, যদি একটি ফাংশন ইনভোকেশন একটি ত্রুটির সাথে শেষ হয়, তাহলে ফাংশনটি আবার ইনভোক করা হয় না এবং ইভেন্টটি বাদ দেওয়া হয়। যখন আপনি একটি ইভেন্ট-চালিত ফাংশনে পুনঃপ্রয়াস সক্ষম করেন, তখন Cloud Functions একটি ব্যর্থ ফাংশন ইনভোকেশন পুনরায় চেষ্টা করে যতক্ষণ না এটি সফলভাবে সম্পূর্ণ হয় অথবা পুনঃপ্রয়াস উইন্ডোর মেয়াদ শেষ হয়।
যখন কোনও ফাংশনের জন্য পুনরায় চেষ্টা সক্রিয় করা না থাকে, যা ডিফল্ট, তখন ফাংশনটি সর্বদা রিপোর্ট করে যে এটি সফলভাবে কার্যকর হয়েছে এবং এর লগে 200 OK
রেসপন্স কোড উপস্থিত হতে পারে। ফাংশনটি কোনও ত্রুটির সম্মুখীন হলেও এটি ঘটে। আপনার ফাংশন কখন কোনও ত্রুটির সম্মুখীন হয় তা স্পষ্ট করার জন্য, যথাযথভাবে ত্রুটিগুলি রিপোর্ট করতে ভুলবেন না।
আপনার ফাংশন কোড থেকে পুনরায় চেষ্টা কনফিগার করুন
Cloud Functions for Firebase এর সাহায্যে, আপনি একটি ফাংশনের কোডে retries সক্ষম করতে পারেন। একটি নতুন Firestore ডকুমেন্ট তৈরির মতো ব্যাকগ্রাউন্ড ইভেন্টের জন্য এটি করতে, failurePolicy
(1st gen) অথবা retry
policy (2nd gen) বিকল্পটি 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
ব্যবহার করুন
যদি আপনার ফাংশনে retries সক্রিয় থাকে, তাহলে যেকোনো unhandled ত্রুটি পুনরায় চেষ্টা শুরু করবে। নিশ্চিত করুন যে আপনার কোড এমন কোনও ত্রুটি ক্যাপচার করে যার ফলে পুনরায় চেষ্টা করা উচিত নয়।
আপনার কী করা উচিত তার একটি উদাহরণ এখানে দেওয়া হল:
return doFooAsync().catch((err) => {
if (isFatal(err)) {
console.error(`Fatal error ${err}`);
}
return Promise.reject(err);
});
পুনরায় চেষ্টাযোগ্য ইভেন্ট-চালিত ফাংশনগুলিকে অযোগ্য করে তুলুন
ইভেন্ট-চালিত ফাংশন যা পুনরায় চেষ্টা করা যেতে পারে তা অবশ্যই অক্ষম হতে হবে। এই ধরনের ফাংশনকে অক্ষম করার জন্য এখানে কিছু সাধারণ নির্দেশিকা দেওয়া হল:
- অনেক বহিরাগত API (যেমন স্ট্রাইপ) আপনাকে একটি প্যারামিটার হিসেবে একটি আইডেম্পোটেন্সি কী সরবরাহ করতে দেয়। যদি আপনি এই ধরনের একটি API ব্যবহার করেন, তাহলে আপনার ইভেন্ট আইডিটিকে আইডেম্পোটেন্সি কী হিসেবে ব্যবহার করা উচিত।
- আইডেম্পোটেন্সি কমপক্ষে একবার ডেলিভারির সাথে ভালো কাজ করে, কারণ এটি পুনরায় চেষ্টা করা নিরাপদ করে তোলে। তাই নির্ভরযোগ্য কোড লেখার জন্য একটি সাধারণ সর্বোত্তম অনুশীলন হল আইডেম্পোটেন্সি এবং পুনরায় চেষ্টা করা।
- নিশ্চিত করুন যে আপনার কোডটি অভ্যন্তরীণভাবে অক্ষম। উদাহরণস্বরূপ:
- নিশ্চিত করুন যে ফলাফল পরিবর্তন না করেই মিউটেশন একাধিকবার ঘটতে পারে।
- একটি লেনদেনের অবস্থা পরিবর্তন করার আগে ডাটাবেসের অবস্থা অনুসন্ধান করুন।
- নিশ্চিত করুন যে সমস্ত পার্শ্বপ্রতিক্রিয়া নিজেই অক্ষম।
- কোডের বাইরে ফাংশনের বাইরে একটি লেনদেনের চেক আরোপ করুন। উদাহরণস্বরূপ, কোথাও একটি নির্দিষ্ট ইভেন্ট আইডি প্রক্রিয়া করা হয়েছে তা রেকর্ড করে স্থির করুন।
- ব্যান্ডের বাইরে ডুপ্লিকেট ফাংশন কলগুলি মোকাবেলা করুন। উদাহরণস্বরূপ, একটি পৃথক পরিষ্কার প্রক্রিয়া আছে যা ডুপ্লিকেট ফাংশন কলের পরে পরিষ্কার করে।
পুনঃচেষ্টা নীতি কনফিগার করুন
আপনার ফাংশনের চাহিদার উপর নির্ভর করে, আপনি সরাসরি পুনরায় চেষ্টা নীতি কনফিগার করতে চাইতে পারেন। এটি আপনাকে নিম্নলিখিতগুলির যেকোনো সমন্বয় সেট আপ করার অনুমতি দেবে:
- পুনঃচেষ্টার সময়কাল ৭ দিন থেকে কমিয়ে ১০ মিনিট করুন।
- সূচকীয় ব্যাকঅফ পুনঃচেষ্টা কৌশলের জন্য সর্বনিম্ন এবং সর্বোচ্চ ব্যাকঅফ সময় পরিবর্তন করুন।
- পুনরায় চেষ্টা করার কৌশলটি পরিবর্তন করে অবিলম্বে পুনরায় চেষ্টা করুন।
- একটি মৃত-অক্ষরের বিষয় কনফিগার করুন।
- সর্বোচ্চ এবং সর্বনিম্ন ডেলিভারি প্রচেষ্টার সংখ্যা নির্ধারণ করুন।
পুনঃচেষ্টা নীতি কনফিগার করতে:
- একটি HTTP ফাংশন লিখ।
- ফাংশনের URL টি লক্ষ্য হিসেবে উল্লেখ করে একটি Pub/Sub সাবস্ক্রিপশন তৈরি করতে Pub/Sub API ব্যবহার করুন।
Pub/Sub সরাসরি কনফিগার করার বিষয়ে আরও তথ্যের জন্য ব্যর্থতা পরিচালনার বিষয়ে Pub/Sub Pub/Sub দেখুন।