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