পাবলিশ/সাবস্ক্রাইব (অথবা pub/sub) একটি সফটওয়্যার ইঞ্জিনিয়ারিং প্যাটার্ন যা দশক ধরে ব্যবহৃত হচ্ছে কিন্তু প্রায়শই ডেডিকেটেড মেসেজিং সার্ভার এবং বিশেষ জ্ঞান প্রয়োজন হতো উপযোগী হওয়ার জন্য।
Redis pub/sub হলো পাবলিশ/সাবস্ক্রাইব প্যাটার্নের একটি লাইন এবং সিম্পল ইমপ্লিমেন্টেশন যা ২.০ রিলিজ থেকে সব Redis সার্ভারের ফিচার। এর মানে এটি সহজে ব্যবহার করা যায় যেখানে Redis ডিপ্লয় করা আছে, এবং একটি ফাস্ট ও সিম্পল pub/sub সিস্টেম দ্রুত তৈরি করা যায় Redis ডিপ্লয় করে।
Redis pub/sub একটি অ্যাপের জন্য উপযুক্ত কিনা বুঝতে হলে প্রথমে pub/sub-এর ডিজাইন ও লক্ষ্য বুঝতে হয়, তারপর Redis pub/sub ইমপ্লিমেন্টেশনের специфиিক বিষয়গুলো বিবেচনা করতে হয়।
Pub/suব ওভারভিউ
Pub/sub ডিজাইন: "পাবলিশার"কে "সাবস্ক্রাইবার" থেকে আলাদা করা
ডিপেন্ডেন্সি কমাতে এবং নলেজ কম্পার্টমেন্টালাইজ করা স্কেলেবল সফটওয়্যার ডিজাইনের মূল লক্ষ্য। পাবলিশ/সাবস্ক্রাইব মেসেজিং প্যাটার্ন, যাকে pub/sub বলা হয়, আপনার সফটওয়্যারের যে অংশগুলো পাবলিশ করে মেসেজ সেগুলোকে যেসব অংশ অ্যাক্ট অন করে মেসেজ সেগুলো থেকে আলাদা করে। ভালোভাবে বুঝতে কয়েকটি উদাহরণ দেখা যাক:
"পাবলিশার"দের উদাহরণ
- একটি চ্যাট রুমে মেসেজ পাঠাতে দেয় এমন একটি অ্যাপ
- একটি ডকার কন্টেইনার যা তার هيلথ বা সার্ভিস anunciar করে
- স্টক ট্রেডের দাম घোষণা করে একটি অ্যাপ
- আপনার বাসার একটি টেম্পারেচার সেন্সর যা তার রিডিং घোষণা করে
- একটি মাল্টিযুজার গেমে মেসেজ ব্রডকাস্টার ("এলন গ্রু দ্বারা খাওয়া হয়েছে")
"সাবস্ক্রাইবার"দের উদাহরণ
- চ্যাট রুমে মেসেজ শোনার জন্য অ্যাপগুলো।
- নোটিফিকেশন Slack-এ ফরওয়ার্ড করে এমন একটি অ্যাপ
- রিয়েল-টাইমে কী হচ্ছে তা দেখার জন্য একটি মোবাইল ক্লায়েন্ট
- বादের অ্যানালাইসিসের জন্য ইভেন্ট রেকর্ড করে এমন একটি লগিং সার্ভিস
Pub/sub প্যাটার্ন আপনাকে সাবস্ক্রাইবার সম্পর্কে বেশি চিন্তা না করে পাবলিশার এর ওপর কাজ করতে দেয়, এবং বিপরীতটিও। উপরের উদাহরণগুলোতে আমরা কল্পনা করতে পারি যে একটি পাবলিশারের মেসেজে একাধিক সাবস্ক্রাইবার আগ্রহী হতে পারে। সাবস্ক্রাইবাররা এমনকি সব পাবলিশার শুনতে চাইতে পারে।
Pub/sub-এ একটি পাবলিশারকে তার সাবস্ক্রাইবারদের জানতে হয় না - এটি একটি চ্যানেল-এ (অন্য সিস্টেমে যাকে টপিক বলা হয়) মেসেজ পুশ করে এবং এগিয়ে যায়। যেসব সাবস্ক্রাইবার সেই চ্যানেল শুনছে যখন মেসেজ পাবলিশ হয়, তারা সেটি পাবে।
সাবস্ক্রাইবাররা এক বা একাধিক চ্যানেল শুনতে এবং মেসেজ আসতে সাথে সাথে রিয়াক্ট করতে ডিজাইন করা হয়। যদি একটি সাবস্ক্রাইবার পাবলিশ হওয়া মেসেজের গতির সাথে তাল মিলাতে না পারে, তবে সেটি কিছু মেসেজ মিস করবে। এটি একটি উপযোগী ডিজাইন: এটি সিস্টেমকে যেকোনো ধীর সাবস্ক্রাইবারের ক্যাপাসিটির চেয়ে বড় স্কেল করতে দেয়। পাবলিশাররা সাবস্ক্রাইবারের বিহেভিয়র থেকে স্লো না হয়ে দ্রুত এগিয়ে যায়।
Pub/sub-এর লক্ষ্য: ডেলিভারি স্কেল করা, ওয়ার্কলোড না
Pub/sub সফটওয়্যার স্কেল করার জন্য ব্যবহৃত একটি প্যাটার্ন - এটি কী ধরনের স্কেলিং-এ সাহায্য করে তা বুঝতে গুরুত্বপূর্ণ। একটি গুরুত্বপূর্ণ পার্থক্য হলো pub/sub এবং মেসেজ কিউইং-এর মধ্যে।
কিউইং প্যাটার্নে, একটি কিউ (বা Redis-এ লিস্ট) মেসেজগুলো বাফার করে প্রসেস করার জন্য থাকতে থাকে যখন একটি ওয়ার্কার পুল লিস্ট থেকে আইটেম পপ করে হ্যান্ডেল করে। এই মডেলে, আপনার ওয়ার্কার পুলের সাইজ স্কেল করলে আপনার কিউ প্রসেস করার গতিটি স্কেল হবে, কারণ প্রতিটি মেসেজ শুধু একটি ওয়ার্কারের কাছে যায়। সব ওয়ার্কার যেকোনো মেসেজ একইভাবে হ্যান্ডেল করে।
Pub/sub-এ অন্যদিকে, সিস্টেম একটি চ্যানেলের সব মেসেজ তার সব সাবস্ক্রাইবারদের কাছে ডেলিভার করার চেষ্টা করে। এটি একটি মেনি-টু-মেনি প্যাটার্ন, যেখানে প্রতিটি আলাদা সাবস্ক্রাইবার মেসেজের সাথে কিছু уникаয় কাজ করে - একটি ডিউরেবল লগে লিখে, একটি Slack চ্যানেলে পাঠায়, একটি লোকাল সেলস অফিসে বেল বাজায়, ইত্যাদি।
সংক্ষেপে, pub/sub মেসেজ ডেলিভারি স্কেল করে, আর কিউইং মেসেজ ওয়ার্কলোড প্রসেসিং স্কেল করে। Redis এই দুটো লক্ষ্যই পূরণের জন্য ব্যবহার হয়। Redis-এ কিউইং-এর জনপ্রিয় উদাহরণ হলো Sidekiq।
Redis pub/sub-এর নির্দিষ্ট বিষয়গুলো
Pub/sub একটি খুব পুরানো প্যাটার্ন, এবং যদি কোর প্যাটার্ন একই থাকে, তবে স্পেসিফিক ফিচারগুলো ইমপ্লিমেন্টেশন থেকে ইমপ্লিমেন্টেশনে খুব ভিন্ন হয়।
Redis pub/sub একটি লাইটওয়েট, ফাস্ট ইমপ্লিমেন্টেশন। এর ডিজাইন বুঝতে কিছু ফিচার দেখতে হবে যা Redis pub/sub-এ নেই:
- নো পারসিস্টেন্স বা ভ্যালু ক্যাশিং
- নো ডেলিভারি গ্যারান্টি
- নো ক্লাস্টার অপ্টিমাইজেশন... এখনো
নো পারসিস্টেন্স: "আমি ভাবছিলাম এটা চ্যাট রুমের মত..."
বেশিরাগ Redis অপারেশনের বিপরীতে, যা ডিস্কে লেখা হতে পারে, Redis pub/sub নন-পারসিস্টেন্ট। পাবলিশড মেসেজ সরাসরি সাবস্ক্রাইবারদের কাছে পাস হয়ে যায় এবং তারপর ড্রপ হয়ে যায়, Redis-এর মেমরি বা ডিস্কে কোনো রেকর্ড থাকে না।
এটি নতুন ইউজারদের জন্য কনফিউজিং হতে পারে যারা শুনেন যে Redis pub/sub প্রায়শই চ্যাট রুম ইমপ্লিমেন্ট করতে ব্যবহৃত হয়। আমরা স্ল্যাকের মতো টুলগুলোকে চ্যাট রুম হিসেবে চিনি - আপনি লগ ইন করলেন এবং সাম্প্রতিক মেসেজগুলো দেখলেন এবং তারপর নতুন সব মেসেজ পেলেন। আসলে "সাম্প্রতিক মেসেজ দেখা" pub/sub-র অংশ নয়, এটিকে আলাদাভাবে হ্যান্ডেল করতে হয়। Pub/sub শুধু নতুন মেসেজের ডেলিভারি ফ্যাসিলিটেট করে। এই অর্থে pub/sub একটি লাইভ স্ট্রিমের মত - আপনি অন করলে ইনফরমেশন পাবেন, কিন্তু অন করার আগে কী হয়েছিল তা জানবেন না। পাশাপাশি: ইন্টারনেট রিলে চ্যাট (IRC) pub/sub মডেল ব্যবহার করে বিল্ট-ইন হিস্টরি বা মেসেজ রিটেনশন ছাড়া - তাই চ্যাট রুম মেটাফর এত phổুলার।
আসলে আপনি Redis এবং pub/sub দিয়ে চ্যাট রুম ইমপ্লিমেন্ট করতে পারেন। সেটির জন্য আপনাকে নিশ্চিত করতে হবে যে মেসেজ শুধু পাবলিশ হওয়া নয়, বরং একটি লিস্ট-এও পুশ করা হচ্ছে যাতে ইউজাররা মেসেজ হিস্টরি দেখতে পারে।
নো ডেলিভারি গ্যারান্টি
Pub/sub মডেলে সাবস্ক্রাইবাররা মেসেজ রিসিভ করার গ্যারান্টি পায় না। যদি একটি সাবস্ক্রাইবারের নেটওয়ার্কিং সমস্যা হয়, মেসেজ দ্রুত পড়তে না পারে, বা অন্যথায় মেসেজ পাবলিশ হওয়ার সময় অটैচড না থাকে, তবে সেটি মেসেজ পাবে না। পাবলিশাররা চ্যানেলে মেসেজ পাঠাতে পারে এমনকি কোনো সাবস্ক্রাইবার না শুনলেও - সেসব মেসেজ ড্রপ হয়ে যায়।
কিছু অন্যান্য মেসেজিং সিস্টেম রিড রিসিপ্ট বা "অ্যাকস" ব্যবহার করে বা একটি সাবস্ক্রাইবারের জন্য বাফার স্টোর করে যা শর্ট ডিসকানেকশনের বিরুদ্ধে গার্ড করে। Redis এখানে সিম্পল অপশন বেছে নিয়েছে: আপনি যদি একটি মেসেজ মিস করেন, তবে আপনি মেসেজটি মিস করেছেন। যেসব মেসেজ অবশ্যই রিসিপিয়েন্টের কাছে পৌঁছাতে হবে, সেগুলো অন্য মানে ডেলিভার করতে হবে।
এই ট্রেডঅফ শুনতে খারাপ লাগে কিন্তু ততটাই খারাপ নয়। মেসেজ অ্যাকনোলেজমেন্ট এবং সাবস্ক্রাইবার-স্পেসিফিক বাফারিং ড্রপ করলে Redis pub/sub মেসেজ খুব দ্রুত প্রসেস করতে পারে, এবং অনেক সিস্টেম আছে যা ফেয়ার-ওয়েদার মেসেজ ডেলিভারি থেকে উপকৃত হয়।
আমতক্ষণে ইনএফিশিয়েন্ট ক্লাস্টার স্কেলিং...
Pub/sub একটি স্কেলিং সমাধান, তাই শুধু আপনার মেসেজ না, আপনার মেসেজ ডেলিভার করার সার্ভিসও স্কেল করতে হয়। অনেক মেসেজিং সিস্টেম, র্যাবিটএমকিউ এবং কাফকা সহ, হাই অ্যাভেইলেবিলিটি এবং যুক্তিসঙ্গত স্কেলিং প্রোপার্টির জন্য ডিজাইন করা হয়েছে মেসেজিং সার্ভিস সেটআপ বড় হলে।
Redis ক্লাস্টার (Redis ৩.০ থেকে অংশ) Redis pub/sub-এর বিল্ট-ইন সাপোর্ট দেয়, একটি গুরুত্বপূর্ণ সতর্কতার সাথে। প্রতিটি পাবলিশড মেসেজ Redis ক্লাস্টারের প্রতিটি মেম্বারে ব্রডকাস্ট হয়, যা বড় ক্লাস্টারকে দ্রুত ট্রাফিক দিয়ে অভিভূত করতে পারে।
সংক্ষিপ্ত উত্তর হলো pub/sub শুধু ইনডিভিজুয়াল Redis সার্ভারে বা ছোট pub/sub-স্পেসিফিক ক্লাস্টারে ব্যবহার করুন - এই দুটো অপশন বড় সংখ্যক মেসেজ হ্যান্ডেল করতে পারে। দীর্ঘমেয়াদে Redis ক্লাস্টারের স্মার্টার ফিচার থাকবে মেসেজ শুধু প্রয়োজন অনুযায়ী রাউট করার জন্য, কিন্তু সেই ফিচার এখনো ডিজাইন ফেজে।
উপসংহার
সার্বিকভাবে Redis pub/sub সফটওয়্যার স্কেল করার জন্য একটি উপযোগী টুল। উপরের ফিচারগুলো যেসব অনুপস্থিত আছে, সেগুলো ডিজাইন ট্রেডঅফ, যার ফলাফল Redis-এ সিম্পলিসিটি এবং স্পিড, সব মেসেজিং উদ্দেশ্যে প্যানেসিয়া না হোনার বিনিময়ে।
Redis-এর অন্যান্য অনেক অংশের মত এটি প্রতিটি স্পেশালাইজড ইউজ-কেসের জন্য টেইলারড নয় কিন্তু একটি বিট বোঝাপড়ার সাথে এটি আপনাকে খুব দূর নিয়ে যেতে পারে। Redis-এর অন্যান্য ফিচারের সাথে জোড়া দিলে এটি একটি খুব পাওয়ারফুল টুল বনে যায় ডেভেলপারের টুলবেল্টে।
এই হাই-লেভেল ওভারভিউ সম্পন্ন হলে, আপনি সম্ভবত কিছু pub/sub কোড উদাহরণ দেখতে প্রস্তুত। Redis Pub/Sub: How To দেখুন।