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

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

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

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

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

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

উপরের যেকোনো ক্ষেত্রে, ফাংশনটি কার্যকর করা বন্ধ করবে এবং একটি ত্রুটি ফিরিয়ে দেবে। ইভেন্ট ট্রিগার যে বার্তাগুলি তৈরি করে তাদের আবার চেষ্টা করার নীতি রয়েছে যা আপনি আপনার ফাংশনের প্রয়োজন মেটাতে কাস্টমাইজ করতে পারেন।

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

Cloud Functions একটি ইভেন্ট উত্স দ্বারা নির্গত প্রতিটি ইভেন্টের জন্য একটি ইভেন্ট-চালিত ফাংশন অন্তত-একবার সম্পাদন করে৷ আপনি যেভাবে পুনরায় চেষ্টা কনফিগার করবেন তা নির্ভর করে আপনি কীভাবে আপনার ফাংশন তৈরি করেছেন তার উপর:

  • Google ক্লাউড কনসোলে বা Cloud Run অ্যাডমিন API-এর মাধ্যমে তৈরি করা ফাংশনগুলির জন্য আপনাকে আলাদাভাবে ইভেন্ট ট্রিগারগুলি তৈরি এবং পরিচালনা করতে হবে৷ ট্রিগারগুলির ডিফল্ট পুনঃপ্রচারের আচরণ রয়েছে যা আপনি আপনার ফাংশনের প্রয়োজন অনুসারে কাস্টমাইজ করতে পারেন।
  • ক্লাউড ফাংশন v2 API দিয়ে তৈরি করা ফাংশনগুলি নিহিতভাবে প্রয়োজনীয় ইভেন্ট ট্রিগার তৈরি করবে, উদাহরণস্বরূপ Pub/Sub বিষয় বা Eventarc ট্রিগার। ডিফল্টরূপে, এই ট্রিগারগুলির জন্য পুনঃপ্রচারগুলি অক্ষম করা হয় এবং ক্লাউড ফাংশন v2 API ব্যবহার করে পুনরায় সক্ষম করা যেতে পারে৷

Cloud Run দিয়ে ইভেন্ট চালিত ফাংশন তৈরি করা হয়েছে

Google ক্লাউড কনসোলে বা Cloud Run অ্যাডমিন API-এর মাধ্যমে তৈরি করা ফাংশনগুলির জন্য আপনাকে আলাদাভাবে ইভেন্ট ট্রিগারগুলি তৈরি এবং পরিচালনা করতে হবে৷ আমরা দৃঢ়ভাবে সুপারিশ করছি যে আপনি প্রতিটি ট্রিগার প্রকারের ডিফল্ট আচরণ পর্যালোচনা করুন:

ক্লাউড ফাংশন v2 API দিয়ে তৈরি ইভেন্ট চালিত ফাংশন

ক্লাউড ফাংশন v2 API ব্যবহার করে তৈরি ফাংশন; উদাহরণস্বরূপ, ক্লাউড ফাংশন gcloud CLI , REST API, বা Terraform ব্যবহার করে আপনার পক্ষ থেকে ইভেন্ট ট্রিগার তৈরি এবং পরিচালনা করবে। ডিফল্টরূপে, যদি একটি ফাংশন আমন্ত্রণ একটি ত্রুটির সাথে বন্ধ হয়ে যায়, তাহলে ফাংশনটি আবার আহ্বান করা হয় না এবং ইভেন্টটি বাদ দেওয়া হয়। আপনি যখন একটি ইভেন্ট-চালিত ফাংশনে পুনঃপ্রচার সক্ষম করেন, তখন Cloud Functions একটি ব্যর্থ ফাংশন আহ্বান পুনঃচেষ্টা করে যতক্ষণ না এটি সফলভাবে সম্পূর্ণ হয় বা পুনরায় চেষ্টা উইন্ডোর মেয়াদ শেষ না হয়।

যখন একটি ফাংশনের জন্য পুনঃপ্রচার সক্রিয় করা হয় না, যা ডিফল্ট, ফাংশনটি সর্বদা রিপোর্ট করে যে এটি সফলভাবে কার্যকর হয়েছে এবং 200 OK প্রতিক্রিয়া কোড এর লগগুলিতে উপস্থিত হতে পারে। ফাংশনটি একটি ত্রুটির সম্মুখীন হলেও এটি ঘটে। আপনার ফাংশন যখন একটি ত্রুটির সম্মুখীন হয় তখন এটি পরিষ্কার করতে, যথাযথভাবে ত্রুটিগুলি রিপোর্ট করতে ভুলবেন না৷

পুনরায় চেষ্টা সক্রিয় বা অক্ষম করুন

কনসোল থেকে পুনরায় চেষ্টা কনফিগার করুন

আপনি যদি একটি নতুন ফাংশন তৈরি করছেন:

  1. ক্রিয়েট ফাংশন স্ক্রীন থেকে, ট্রিগারের অধীনে এবং আপনার ফাংশনের জন্য ট্রিগার হিসাবে কাজ করার জন্য ইভেন্টের ধরন নির্বাচন করুন।
  2. পুনরায় চেষ্টা সক্রিয় করতে ব্যর্থতার উপর পুনরায় চেষ্টা করুন চেকবক্স নির্বাচন করুন।

আপনি যদি একটি বিদ্যমান ফাংশন আপডেট করছেন:

  1. Cloud Functions ওভারভিউ পৃষ্ঠা থেকে, আপনি যে ফাংশনটি আপডেট করছেন সেটির ফাংশন বিবরণ স্ক্রীন খুলতে ক্লিক করুন, তারপর ট্রিগার ফলক প্রদর্শন করতে মেনু বার থেকে সম্পাদনা নির্বাচন করুন।
  2. পুনরায় চেষ্টা সক্ষম বা নিষ্ক্রিয় করতে ব্যর্থতার উপর পুনরায় চেষ্টা করুন চেকবক্সটি নির্বাচন করুন বা সাফ করুন।

আপনার ফাংশন কোড থেকে পুনরায় চেষ্টা কনফিগার করুন

Cloud Functions for Firebase সাথে, আপনি একটি ফাংশনের জন্য কোডে পুনঃপ্রচারগুলি সক্ষম করতে পারেন৷ একটি ব্যাকগ্রাউন্ড ফাংশনের জন্য এটি করতে যেমন functions.foo.onBar(myHandler); , runWith ব্যবহার করুন এবং একটি ব্যর্থতার নীতি কনফিগার করুন:

functions.runWith({failurePolicy: true}).foo.onBar(myHandler);

দেখানো হিসাবে true সেট করা ব্যর্থতার উপর পুনরায় চেষ্টা করার জন্য একটি ফাংশন কনফিগার করে।

উইন্ডো পুনরায় চেষ্টা করুন

2nd জেনার ফাংশনগুলির জন্য, এই পুনঃচেষ্টা উইন্ডোটি 24 ঘন্টা পরে শেষ হয়৷ 1ম জেনার ফাংশনগুলির জন্য, এটি 7 দিন পরে শেষ হয়ে যায়। Cloud Functions 10 থেকে 600 সেকেন্ডের মধ্যে ক্রমবর্ধমান ব্যাকঅফ সহ একটি সূচকীয় ব্যাকঅফ কৌশল ব্যবহার করে নতুন তৈরি ইভেন্ট-চালিত ফাংশনগুলি পুনরায় চেষ্টা করে৷ এই নীতিটি নতুন ফাংশনগুলিতে প্রয়োগ করা হয় যখন আপনি প্রথমবার তাদের স্থাপন করেন। এই রিলিজ নোটে বর্ণিত পরিবর্তনগুলি কার্যকর হওয়ার আগে বিদ্যমান ফাংশনগুলিতে এটি পূর্ববর্তীভাবে প্রয়োগ করা হয় না, এমনকি যদি আপনি ফাংশনগুলি পুনরায় স্থাপন করেন।

সর্বোত্তম অনুশীলন

এই বিভাগটি পুনরায় চেষ্টা করার জন্য সর্বোত্তম অনুশীলনগুলি বর্ণনা করে।

ক্ষণস্থায়ী ত্রুটিগুলি পরিচালনা করতে পুনরায় চেষ্টা করুন ব্যবহার করুন

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

অসীম পুনরায় চেষ্টা লুপ এড়াতে একটি শেষ শর্ত সেট করুন

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

একটি সহজ কিন্তু কার্যকর পদ্ধতি হল একটি নির্দিষ্ট সময়ের চেয়ে পুরানো টাইমস্ট্যাম্প সহ ইভেন্টগুলি বাতিল করা৷ এটি অত্যধিক মৃত্যুদণ্ড এড়াতে সাহায্য করে যখন ব্যর্থতাগুলি হয় স্থায়ী হয় বা প্রত্যাশার চেয়ে দীর্ঘস্থায়ী হয়।

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

পুনরায় চেষ্টা নীতি কনফিগার করতে:

  1. একটি HTTP ফাংশন লিখুন।
  2. একটি Pub/Sub সাবস্ক্রিপশন তৈরি করতে Pub/Sub API ব্যবহার করুন, লক্ষ্য হিসাবে ফাংশনের URL উল্লেখ করে।

সরাসরি Pub/Sub কনফিগার করার বিষয়ে আরও তথ্যের জন্য ব্যর্থতাগুলি পরিচালনা করার বিষয়ে Pub/Sub ডকুমেন্টেশন দেখুন।