অ্যাসিঙ্ক্রোনাস ফাংশন পুনরায় চেষ্টা করুন

এই দস্তাবেজটি বর্ণনা করে যে আপনি কীভাবে অসিঙ্ক্রোনাস (নন-HTTPS) ব্যাকগ্রাউন্ড ফাংশনগুলি ব্যর্থ হওয়ার জন্য পুনরায় চেষ্টা করতে অনুরোধ করতে পারেন৷

পুনরায় চেষ্টা করার শব্দার্থবিদ্যা

ক্লাউড ফাংশন একটি ইভেন্ট উত্স দ্বারা নির্গত প্রতিটি ইভেন্টের জন্য একটি ইভেন্ট-চালিত ফাংশন অন্তত একবার কার্যকর করার গ্যারান্টি দেয়৷ যাইহোক, ডিফল্টরূপে, যদি একটি ফাংশন আমন্ত্রণ একটি ত্রুটির সাথে সমাপ্ত হয়, তাহলে ফাংশনটি পুনরায় আহ্বান করা হবে না এবং ইভেন্টটি বাদ দেওয়া হবে। আপনি যখন একটি ইভেন্ট-চালিত ফাংশনে পুনঃপ্রচার চালু করেন, তখন ক্লাউড ফাংশন একটি ব্যর্থ ফাংশন আমন্ত্রণ পুনরায় চেষ্টা করবে যতক্ষণ না এটি সফলভাবে সম্পূর্ণ হয়, অথবা পুনরায় চেষ্টা করার উইন্ডো (ডিফল্টরূপে, 7 দিন) মেয়াদ শেষ না হয়।

কেন ইভেন্ট-চালিত ফাংশন সম্পূর্ণ করতে ব্যর্থ হয়

বিরল ক্ষেত্রে, একটি অভ্যন্তরীণ ত্রুটির কারণে একটি ফাংশন সময়ের আগেই প্রস্থান করতে পারে এবং ডিফল্টরূপে ফাংশনটি স্বয়ংক্রিয়ভাবে পুনরায় চেষ্টা করা হতে পারে বা নাও হতে পারে।

আরও সাধারণত, একটি ইভেন্ট-চালিত ফাংশন ফাংশন কোডে ত্রুটির কারণে সফলভাবে সম্পূর্ণ করতে ব্যর্থ হতে পারে। এটি ঘটতে পারে এমন কিছু কারণ নিম্নরূপ:

  • ফাংশনে একটি বাগ রয়েছে এবং রানটাইম একটি ব্যতিক্রম নিক্ষেপ করে।
  • ফাংশনটি কোনও পরিষেবার এন্ডপয়েন্টে পৌঁছাতে পারে না, বা শেষ পয়েন্টে পৌঁছানোর চেষ্টা করার সময় সময় শেষ হতে পারে না।
  • ফাংশন ইচ্ছাকৃতভাবে একটি ব্যতিক্রম নিক্ষেপ করে (উদাহরণস্বরূপ, যখন একটি প্যারামিটার বৈধতা ব্যর্থ হয়)।
  • যখন Node.js-এ লেখা ফাংশনগুলি একটি প্রত্যাখ্যাত প্রতিশ্রুতি প্রদান করে বা একটি কলব্যাকে একটি নন- null মান পাস করে।

উপরের যেকোনো ক্ষেত্রে, ফাংশনটি ডিফল্টরূপে কার্যকর করা বন্ধ করে দেয় এবং ইভেন্টটি বাতিল করা হয়। আপনি যদি একটি ত্রুটি ঘটলে ফাংশনটি পুনরায় চেষ্টা করতে চান, আপনি "ব্যর্থতার উপর পুনরায় চেষ্টা করুন" বৈশিষ্ট্য সেট করে ডিফল্ট পুনঃপ্রচার নীতি পরিবর্তন করতে পারেন। এর ফলে ফাংশনটি সফলভাবে সম্পূর্ণ না হওয়া পর্যন্ত একাধিক দিন পর্যন্ত ইভেন্টটি বারবার পুনঃচেষ্টা করা হয়।

পুনরায় চেষ্টা সক্রিয় এবং নিষ্ক্রিয় করা হচ্ছে

GCP কনসোল ব্যবহার করে

আপনি নিম্নোক্তভাবে GCP কনসোলে পুনরায় চেষ্টাগুলি সক্ষম বা নিষ্ক্রিয় করতে পারেন:

  1. ক্লাউড প্ল্যাটফর্ম কনসোলে ক্লাউড ফাংশন ওভারভিউ পৃষ্ঠাতে যান।

  2. ফাংশন তৈরি করুন ক্লিক করুন। বিকল্পভাবে, একটি বিদ্যমান ফাংশনের বিস্তারিত পৃষ্ঠায় যেতে ক্লিক করুন এবং সম্পাদনা ক্লিক করুন।

  3. আপনার ফাংশনের জন্য প্রয়োজনীয় ক্ষেত্রগুলি পূরণ করুন।

  4. নিশ্চিত করুন ট্রিগার ক্ষেত্রটি একটি ইভেন্ট-ভিত্তিক ট্রিগার প্রকারে সেট করা আছে, যেমন ক্লাউড পাব/সাব বা ক্লাউড স্টোরেজ।

  5. আরও ক্লিক করে উন্নত সেটিংস প্রসারিত করুন।

  6. ব্যর্থতার উপর পুনরায় চেষ্টা করুন লেবেলযুক্ত বাক্সটি চেক করুন বা আনচেক করুন৷

ফাংশন কোডে

ফায়ারবেসের জন্য ক্লাউড ফাংশনগুলির সাথে, আপনি একটি ফাংশনের জন্য কোডে পুনঃপ্রচারগুলি সক্ষম করতে পারেন৷ একটি ব্যাকগ্রাউন্ড ফাংশনের জন্য এটি করতে যেমন 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 ব্যবহার করেন তবে আপনার ইভেন্ট আইডিটি আইডেমপোটেন্সি কী হিসাবে ব্যবহার করা উচিত।
  • অদম্যতা অন্তত-একবার ডেলিভারির সাথে ভাল কাজ করে, কারণ এটি আবার চেষ্টা করা নিরাপদ করে তোলে। তাই নির্ভরযোগ্য কোড লেখার জন্য একটি সাধারণ সর্বোত্তম অভ্যাস হল পুনঃপ্রচারের সাথে অদম্যতাকে একত্রিত করা।
  • নিশ্চিত করুন যে আপনার কোডটি অভ্যন্তরীণভাবে অদম্য। উদাহরণ স্বরূপ:
    • নিশ্চিত করুন যে পরিব্যক্তি ফলাফল পরিবর্তন না করে একাধিকবার ঘটতে পারে।
    • রাষ্ট্র পরিবর্তন করার আগে একটি লেনদেনে ডাটাবেসের অবস্থা জিজ্ঞাসা করুন।
    • নিশ্চিত করুন যে সমস্ত পার্শ্বপ্রতিক্রিয়া নিজেরাই বুদ্ধিমত্তাহীন।
  • কোড থেকে স্বাধীন, ফাংশনের বাইরে একটি লেনদেন চেক আরোপ করুন। উদাহরণ স্বরূপ, একটি প্রদত্ত ইভেন্ট আইডি ইতিমধ্যেই প্রক্রিয়া করা হয়েছে এমন কোথাও রেকর্ড করে রেখে দিন।
  • ডুপ্লিকেট ফাংশন কল আউট অফ ব্যান্ড সঙ্গে ডিল. উদাহরণস্বরূপ, একটি পৃথক ক্লিন আপ প্রক্রিয়া করুন যা ডুপ্লিকেট ফাংশন কলের পরে পরিষ্কার হয়।