了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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