ক্লায়েন্টরা বিজ্ঞপ্তিগুলি গ্রহণ করতে ব্যর্থ হলে সূচকীয় ব্যাকঅফ সহ ক্লায়েন্টদের কাছে ওয়েবহুক বিজ্ঞপ্তি পাঠানোর জন্য আমি RabbitMQ ব্যবহার করতে চেয়েছিলাম।
নির্ধারিত বা বিলম্বিত বার্তাগুলির অনেকগুলি ব্যবহার রয়েছে এবং আমি ক্লায়েন্টদের বিজ্ঞপ্তিগুলি পেতে ব্যর্থ হলে এক্সপোনেনশিয়াল ব্যাকঅফ সহ ওয়েবহুক বিজ্ঞপ্তিগুলি পাঠানোর জন্য আমি RabbitMQ ব্যবহার করতে চাই৷
কিন্তু, RabbitMQ AMQP প্রোটোকল ব্যবহার করে যাতে নির্ধারিত বা বিলম্বিত বার্তা পাঠানোর জন্য কোনো নেটিভ বৈশিষ্ট্য নেই। কিন্তু এটি বাস্তবায়ন করার উপায় আছে:
- ব্যবহার a কমিউনিটি প্লাগইন
rabbitmq_delayed_message_exchange
(উত্পাদন পরিবেশের জন্য প্রস্তাবিত নয়) - ব্যবহার করুন মৃত চিঠি বিনিময় সঙ্গে বার্তা টিটিএল.
প্রথমে কমিউনিটি প্লাগইন দেখি।
আপনি যদি বাস্তবায়নে ঝাঁপ দিতে চান তবে আপনি পড়তে পারেন এই নিবন্ধ. আপনি যদি টাইমার সম্পর্কে খুব বেশি যত্ন না করেন তবে আপনি এই খুব সহজ সমাধানটি নিয়ে এগিয়ে যেতে পারেন। কিন্তু উৎপাদন পরিবেশে এটি ব্যবহার করার আগে আপনাকে দুবার ভাবতে হবে।
আপনি প্লাগইন এর যেতে পারেন Github সংগ্রহস্থল এবং সীমাবদ্ধতা পরীক্ষা করুন। এই ব্লগটি লেখার সময়, এটির একটি নির্দিষ্ট সীমাবদ্ধতা রয়েছে যা আপনার আবেদনে অসঙ্গতি আনতে পারে:
যদি RabbitMQ সার্ভারে কিছু ঘটে বা এটি পুনরায় চালু হয়, আপনার টাইমারগুলি হারিয়ে গেছে। এর অর্থ হল আপনি যদি বার্তাটি এক মিনিট, এক ঘন্টা বা হয়তো একদিন পরে পাঠানোর জন্য সেট করেন এবং আপনার সার্ভারে কিছু ঘটে, সার্ভারটি আসার সাথে সাথে বার্তাগুলি গ্রাস করা হয়।
আমি এই প্লাগইনের চেয়ে বার্তা টিটিএল পদ্ধতির সাথে ডেড লেটার এক্সচেঞ্জকে উল্লেখযোগ্যভাবে ভাল পেয়েছি (অবশ্যই কিছু সীমাবদ্ধতা রয়েছে তবে অন্তত এই পদ্ধতিটি আরও ধারাবাহিকতা নিয়ে আসে)।
বার্তা টিটিএল এর সাথে ডেড লেটার এক্সচেঞ্জ ব্যবহার করা
এই পদ্ধতিটি বোঝার জন্য, এই দুটি আইটেম কী তা বোঝার জন্য আপনাকে অবশ্যই উপরের লিঙ্কগুলি পরীক্ষা করতে হবে। আমি এখানে পদ্ধতির সারসংক্ষেপ করব।
এটির জন্য 2টি সারি প্রয়োজন (আসুন তাদের কল করি primary queue
এবং waiting queue
) এবং 1 বিনিময়। নির্দিষ্ট ওয়েবহুক ব্যবহারের ক্ষেত্রে, আমি এই পদ্ধতিটি ব্যবহার করার সিদ্ধান্ত নিয়েছি:
- বার্তাগুলিকে প্রাথমিক সারিতে পুশ করতে থাকুন।
- অবিলম্বে ক্লায়েন্টদের বিজ্ঞপ্তি পাঠানোর চেষ্টা করুন.
- আপনি যদি সফলতা না পান, তাহলে TTL যোগ করুন এবং এটিতে পুশ করুন
waiting queue
. - যে নির্দিষ্ট TTL পরে, বার্তা রাউট করা হবে
primary queue
এক্সচেঞ্জ ব্যবহার করে এবং আবার চেষ্টা করার জন্য ব্যবহার করা যেতে পারে। - ব্যর্থতার ক্ষেত্রে সূচকীয় ব্যাকঅফ অর্জন করতে প্রতিটি পুনঃপ্রচেষ্টার পরে TTL বাড়াতে থাকুন।
আপনি যদি অবিলম্বে সেগুলি পাঠাতে না চান, আপনি প্রথম 2টি ধাপ এড়িয়ে যেতে পারেন এবং সরাসরি বার্তাগুলিকে অপেক্ষার সারিতে ঢোকাতে পারেন৷
এখন, যদি আমরা একটি ডায়াগ্রাম আঁকি, এটি দেখতে এরকম কিছু হবে (এই চিত্র দেখে অভিভূত হবেন না):
এই সহজ এবং সহজবোধ্য রাখতে, আমি কোন নির্দিষ্ট ভাষায় এটি কোড করতে চাই না। পরিবর্তে, আমি ম্যানেজমেন্ট ড্যাশবোর্ড ব্যবহার করব।
ব্যবস্থাপনা ড্যাশবোর্ড ব্যবহার করে বাস্তবায়ন
ধাপ 1: একটি ভার্চুয়াল হোস্ট তৈরি করুন
ম্যানেজমেন্ট ড্যাশবোর্ডে লগ ইন করার পরে, আপনি যদি ইতিমধ্যে না থাকেন তবে একটি ভার্চুয়াল হোস্ট তৈরি করুন৷ আমি সাধারণত একটি ভার্চুয়াল হোস্ট তৈরি করতে পছন্দ করি কারণ এটি যৌক্তিক গ্রুপিং এবং সংস্থানগুলির বিচ্ছেদ প্রদান করে।
এখানে, আমি নামের একটি ভার্চুয়াল হোস্ট তৈরি করেছি: my-host
.
ধাপ 2: একটি এক্সচেঞ্জ তৈরি করুন
এখন, যান Exchanges
ট্যাব এবং “একটি নতুন বিনিময় যোগ করুন”।
- ভার্চুয়াল হোস্ট নির্বাচন করুন:
my-host
বা যাই হোক না কেন ভার্চুয়াল হোস্ট আপনি ধাপ 1 এ তৈরি করেছেন। - আপনার বিনিময় একটি নাম যোগ করুন. এখানে, আমি রাখা
my-exchange
. - টাইপকে এতে পরিবর্তন করুন
topic
. (এই ব্লগের জন্য কোন ধরনের বিনিময়ের সুযোগের বাইরে আলোচনা)
ধাপ 3: সারি তৈরি করুন
যেমন আমরা উপরে আলোচনা করেছি, আমাদের 2টি সারি তৈরি করতে হবে। এটি করতে, যান Queues
ট্যাব এবং “একটি নতুন সারি যোগ করুন”।
প্রথম সারির জন্য, আপনাকে শুধু এই 2টি ক্ষেত্র কনফিগার করতে হবে:
- ভার্চুয়াল হোস্ট:
my-host
- নাম:
primary-queue
দ্বিতীয় সারির জন্য,
- ভার্চুয়াল হোস্ট:
my-host
- নাম:
waiting-queue
- আর্গুমেন্ট যোগ করতে, ক্লিক করুন
Dead letter exchange
মান সেট করুন:my-exchange
. - ক্লিক করুন
Dead letter routing key
মান সেট করুন:primary
.
ধাপ 4: রাউটিং এর জন্য এক্সচেঞ্জ বাইন্ডিং সেট আপ করুন
সফলভাবে এই 2টি সারি তৈরি করার পরে, আবার যান Exchanges
ট্যাব এবং এক্সচেঞ্জে ক্লিক করুন যা আমরা ২য় ধাপে তৈরি করেছি। আমার ক্ষেত্রে, এটি my-exchange
.
এখন প্রসারিত Bindings
এবং নিম্নলিখিত বিবরণ যোগ করুন:
- সারিবদ্ধ করতে:
primary-queue
- রাউটিং কী:
primary
সেটাই।
আমাদের কনফিগারেশন পরীক্ষা করা যাক
এই রাউটিংটি সঠিকভাবে কাজ করছে কিনা তা জানতে, আমরা একটি বার্তা প্রকাশ করব waiting-queue
10 সেকেন্ডের TTL সহ। এর মানে, বার্তাটি শুধুমাত্র 10 সেকেন্ডের জন্য অপেক্ষার সারিতে থাকবে এবং তারপরে এটি চলে যাবে primary-queue
.
অপেক্ষার সারিতে একটি বার্তা প্রকাশ করুন
যান Queues
ট্যাব এবং ক্লিক করুন waiting-queue
. এখন “বার্তা প্রকাশ করুন” বিভাগটি প্রসারিত করুন এবং নিম্নলিখিত বিবরণ যোগ করুন:
- “বৈশিষ্ট্য”-এ যোগ করুন
expiration
এবং এর মান সেট করুন10000
(10 সেকেন্ড)। এর অর্থ হল বার্তাটি 10 সেকেন্ডের জন্য অপেক্ষার সারিতে থাকবে। - “পেলোড” বিভাগে যেকোনো বার্তা যোগ করুন। এখানে, আমি “হ্যালো ওয়ার্ল্ড!” রেখেছি।
মনিটর
এখন আবার ক্লিক করুন Queues
ট্যাব আপনি যদি কোন বার্তা দেখতে না পান waiting-queue
পৃষ্ঠা রিফ্রেশ করুন। আপনি যদি সবকিছু সঠিকভাবে কনফিগার করে থাকেন, 10 সেকেন্ড পরে, আপনি দেখতে পাবেন যে একই বার্তা এখন primary-queue
.
সূচকীয় ব্যাকঅফ অর্জন করতে, আপনি প্রতিটি পুনঃপ্রচেষ্টাতে বার্তার মেয়াদ শেষ হওয়ার সময় বাড়িয়ে দিতে পারেন।
সাধারণ ভুল
শুধুমাত্র 1টি অপেক্ষার সারি তৈরি করা হচ্ছে
সূচকীয় ব্যাকঅফ অর্জন করার সময়, আপনি যদি মেয়াদ শেষ হওয়ার সময় বাড়াতে থাকেন এবং একই অপেক্ষার সারিতে বার্তা প্রকাশ করেন, আপনি লক্ষ্য করবেন যে কিছু সময় আপনার টাইমারগুলি সঠিকভাবে কাজ করছে না।
আপনি যদি পড়েছেন message TTL
লিঙ্কটি আমি শুরুতে শেয়ার করেছি, সেখানে একটি বিভাগ রয়েছে: প্রতি বার্তা ttl সতর্কতা. এটা বলে যে আপনার বার্তার মেয়াদ শেষ হয়ে যাবে এবং ডেড-লেটার কিউতে যাবে যখন সেগুলি সারির মাথায় পৌঁছাবে.
উদাহরণস্বরূপ, আপনি মেয়াদ শেষ হওয়ার সময় সহ একটি বার্তা প্রকাশ করেছেন — 1 ঘন্টা। এখন আপনি যদি মেয়াদ শেষ হওয়ার সময় – 1 মিনিটের সাথে একই অপেক্ষার সারিতে একটি বার্তা প্রকাশ করেন, তবে দ্বিতীয় বার্তাটি (মেয়াদ শেষ হওয়ার সময় 1 মিনিটের সাথে) শুধুমাত্র 1 ঘন্টা পরে মেয়াদ শেষ হবে (এবং মৃত-অক্ষরের সারিতে যাবে)।
ম্যানেজমেন্ট ড্যাশবোর্ডে এই মানগুলির সাথে কনফিগার করার পরে এবং খেলার পরে, আপনি সহজেই এটিকে যে কোনো ভাষায় কোড করতে পারেন। আপনি যদি এই বিষয় এবং নিবন্ধটি পছন্দ করেন তবে আমাকে জানান টুইটার এবং সবার সাথে জ্ঞান ভাগ করুন.