পাঠ ৩২ · ৫১-এর মধ্যে · মডিউল ৮
Home / Courses / System Design / গসিপ প্রোটোকল

গসিপ প্রোটোকল

The gossip protocol
৭ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • কেন সেন্ট্রাল কোঅর্ডিনেটর এবং all-to-all মেসেজিং — দুটোই বড় স্কেলে অবাস্তব
  • গসিপ প্রোটোকল কীভাবে এপিডেমিক-স্টাইলে তথ্য ছড়ায় এবং কেন এটি O(log N) রাউন্ডে সব নোডে পৌঁছায়
  • বাস্তব জগতে গসিপের ব্যবহার — ক্লাস্টার মেম্বারশিপ, ফেইলিওর ডিটেকশন, ইভেন্চুয়ালি-কনসিস্টেন্ট স্টেট প্রপাগেশন
  • Python-এ ১৬টি নোডের একটি গসিপ সিমুলেশন — কত রাউন্ডে সব নোড তথ্য পায় তা পরিমাপ করা

১ · সমস্যা — কেন্দ্রীয় সমন্বয়ক ছাড়া ক্লাস্টার স্টেট জানা

ধরুন আপনার একটি ক্লাস্টারে ১,০০০টি নোড আছে — প্রতিটি নোড জানতে চায় বাকি সব নোড এখনো জীবিত কি না, অথবা কোনো নতুন কনফিগারেশন সবার কাছে পৌঁছেছে কি না। দুটো সহজ সমাধান আছে, কিন্তু দুটোই বড় স্কেলে ভেঙে পড়ে —

কেন্দ্রীয় সমন্বয়ক
একটি সার্ভার সবার স্টেট ট্র্যাক করে। কিন্তু এই একটি সার্ভারই তখন একমাত্র পয়েন্ট অফ ফেইলিওর এবং বটলনেক হয়ে যায়।
All-to-all মেসেজিং
প্রতিটি নোড সরাসরি বাকি সব নোডকে মেসেজ পাঠায় — N নোডে এটি O(N²) মেসেজ তৈরি করে। ১,০০০ নোডে এটি প্রায় ১০ লক্ষ মেসেজ প্রতি রাউন্ডে!
সমস্যার মূল

আমাদের এমন একটি পদ্ধতি দরকার যা কোনো একক পয়েন্ট অফ ফেইলিওর তৈরি করে না, এবং যার নেটওয়ার্ক খরচ N বাড়লেও নিয়ন্ত্রণে থাকে। এই সমস্যার সমাধান এসেছে জীববিজ্ঞান থেকে অনুপ্রাণিত হয়ে — গুজব বা মহামারী কীভাবে ছড়ায়, ঠিক সেই মডেল অনুসরণ করে।

২ · গসিপ প্রোটোকল — এপিডেমিক-স্টাইল স্প্রেড

গসিপ প্রোটোকলGossip Protocolএমন একটি কমিউনিকেশন পদ্ধতি যেখানে প্রতিটি নোড পর্যায়ক্রমে (রাউন্ডে) মাত্র একটি বা কয়েকটি র‍্যান্ডম অন্য নোডের সাথে তার স্টেট শেয়ার করে — কোনো কেন্দ্রীয় সমন্বয়ক বা all-to-all মেসেজিং ছাড়াই তথ্য পুরো ক্লাস্টারে ছড়িয়ে পড়ে। মানে প্রতি রাউন্ডে প্রতিটি "ইনফর্মড" (তথ্য জানা) নোড একটি র‍্যান্ডম অন্য নোড বেছে নিয়ে তাকে তথ্য জানায়। সেই নোড পরের রাউন্ডে নিজেও "ইনফর্মড" হয়ে যায় এবং আরও নোডকে জানাতে শুরু করে।

প্রথম রাউন্ডে ১টি নোড জানে, ২য় রাউন্ডে সেটি প্রায় ২টি নোডে পৌঁছায়, ৩য় রাউন্ডে প্রায় ৪টিতে — প্রতিটি রাউন্ডে "ইনফর্মড" নোডের সংখ্যা প্রায় দ্বিগুণ হয়। ঠিক যেমন একজন থেকে একটি গুজব ছড়ালে দ্রুতই পুরো শহর জেনে যায়, এখানেও তথ্য O(log N) রাউন্ডে সব N নোডে পৌঁছে যায় — লিনিয়ার বা কোয়াড্রেটিক সময়ে নয়।

রাউন্ড ০ ১ নোড ইনফর্মড রাউন্ড ১ ~২ নোড ইনফর্মড রাউন্ড ২ ~৪ নোড ইনফর্মড রাউন্ড log₂N
প্রতিটি রাউন্ডে ইনফর্মড নোডের সংখ্যা প্রায় দ্বিগুণ হয় — তাই N নোডে পৌঁছাতে মাত্র log₂N রাউন্ড লাগে, N রাউন্ড নয়।
গসিপের বাস্তব ব্যবহার

ক্লাস্টার মেম্বারশিপ ও ফেইলিওর ডিটেকশন — Cassandra ও Consul-এর মতো সিস্টেমে প্রতিটি নোড নিয়মিত গসিপের মাধ্যমে জানায় "আমি জীবিত আছি" এবং অন্য নোডদের সম্পর্কে তার সর্বশেষ জানা তথ্য শেয়ার করে। কোনো নোড অনেকক্ষণ গসিপে অংশ না নিলে বাকিরা ধরে নেয় সেটি ডাউন হয়ে গেছে। একই প্রক্রিয়া ইভেন্চুয়ালি-কনসিস্টেন্ট স্টেট প্রপাগেশনের (যেমন নতুন কনফিগারেশন বা রাউটিং টেবিল) জন্যও ব্যবহৃত হয়।

৩ · সিমুলেশন — ১৬টি নোডে গসিপ ছড়ানো

নিচের কোডে ১৬টি নোড আছে, শুরুতে শুধু নোড ০ তথ্য জানে। প্রতিটি রাউন্ডে, প্রতিটি ইনফর্মড নোড একটি র‍্যান্ডম অন্য নোড বেছে নিয়ে তাকে জানায় (রিপ্রোডিউসিবিলিটির জন্য একটি ফিক্সড-সিড random.Random(42) ব্যবহার করা হয়েছে — কখনো আনসিডেড random ব্যবহার করা হয় না, কারণ তাহলে প্রতিবার আলাদা ফলাফল আসত)।

Python
import random

rng = random.Random(42)          # ফিক্সড সিড — রিপ্রোডিউসিবল ফলাফলের জন্য
num_nodes = 16
all_nodes = list(range(num_nodes))
informed = {0}                    # শুরুতে শুধু নোড ০ জানে
round_num = 0

print(f"রাউন্ড {round_num}: informed = {len(informed)}/{num_nodes}")

while len(informed) < num_nodes:
    round_num += 1
    newly = set()
    for node in list(informed):
        others = [n for n in all_nodes if n != node]
        target = rng.choice(others)   # একটি র‍্যান্ডম *অন্য* নোড বেছে নেওয়া
        newly.add(target)
    informed |= newly
    print(f"রাউন্ড {round_num}: informed = {len(informed)}/{num_nodes}")

print(f"\nমোট রাউন্ড লাগল: {round_num} (log2(16) = 4, তাই এটি লগারিদমিক ধারার কাছাকাছি)")

    
লক্ষ্য করুন — মাত্র কয়েকটি রাউন্ডেই ১৬টি নোডের সবাই তথ্য পেয়ে যায়, যদিও কোনো নোডই একসাথে একাধিক নোডকে জানাচ্ছে না। এটাই গসিপের শক্তি: প্রতি রাউন্ডে সামান্য কাজ (প্রতি নোডে মাত্র ১টি মেসেজ), কিন্তু সামগ্রিক প্রভাব সূচকীয় (exponential) — এই কারণেই বাস্তব সিস্টেমে প্রতি রাউন্ডে সাধারণত একাধিক (যেমন ৩টি) র‍্যান্ডম নোডকে জানানো হয়, যাতে নোড ডাউন থাকলেও তথ্য দ্রুত ও নির্ভরযোগ্যভাবে ছড়ায়।
মূল কথা · Key takeaway

গসিপ প্রোটোকল কোনো নিখুঁত সমাধান নয় — এটি প্রোবাবিলিস্টিক (সম্ভাব্যতা-ভিত্তিক): তত্ত্বগতভাবে কোনো তথ্য কখনো সব নোডে না-ও পৌঁছাতে পারে, যদিও বাস্তবে সম্ভাবনা অত্যন্ত কম এবং কয়েক রাউন্ডের মধ্যেই কার্যত সবাই জেনে যায়। বিনিময়ে যা পাওয়া যায় তা হলো — কোনো একক পয়েন্ট অফ ফেইলিওর নেই, এবং নেটওয়ার্ক লোড all-to-all-এর তুলনায় বহুগুণ কম।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ গসিপ প্রোটোকল all-to-all মেসেজিং-এর তুলনায় নেটওয়ার্ক ট্রাফিক কীভাবে কমায় — একদম সংখ্যা দিয়ে বোঝান।

All-to-all-এ N নোডের প্রতিটি বাকি (N-1)টি নোডকে মেসেজ পাঠায়, অর্থাৎ প্রতি রাউন্ডে প্রায় N² মেসেজ। গসিপে প্রতিটি ইনফর্মড নোড মাত্র একটি মেসেজ পাঠায় প্রতি রাউন্ডে, এবং মোট রাউন্ড সংখ্যা মাত্র O(log N)। ১,০০০ নোডের ক্লাস্টারে all-to-all প্রায় ১০ লক্ষ মেসেজ/রাউন্ড তৈরি করবে, যেখানে গসিপে সর্বোচ্চ কয়েক হাজার মেসেজ, মাত্র ~১০ রাউন্ডে (log₂1000 ≈ ১০) সবাইকে পৌঁছে দেয়।

প্র ০২ গসিপ প্রোটোকল কেন একটি "কেন্দ্রীয় পয়েন্ট অফ ফেইলিওর" থেকে মুক্ত — এবং এটি কেন গুরুত্বপূর্ণ?

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

প্র ০৩ গসিপ প্রোটোকল কি "স্ট্রং কনসিস্টেন্সি" নাকি "ইভেন্চুয়াল কনসিস্টেন্সি" দেয় (L04 দেখুন)? ব্যাখ্যা করুন।

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

অনুশীলন

  1. পরিবর্তন করুন: উপরের কোড সেলে num_nodes ৬৪ করুন এবং প্রতিটি রাউন্ডে প্রতি নোড কতটি রাউন্ডে সবাইকে পৌঁছায় তা লক্ষ করুন — log₂64 = ৬-এর কাছাকাছি কি না মিলিয়ে দেখুন।

    num_nodes = 64 করে চালালে (একই সিড ৪২ দিয়ে) সাধারণত ৭-৯ রাউন্ডের মধ্যে সব নোড ইনফর্মড হয়ে যাবে — log₂64 = ৬-এর খুব কাছাকাছি, ঠিক log₂N নয় কারণ প্রতিটি নোড একটি মাত্র র‍্যান্ডম নোড বেছে নেয় বলে মাঝেমধ্যে একই টার্গেট বারবার বাছাই হতে পারে (যাকে বাস্তব সিস্টেমে "রিডান্ড্যান্ট গসিপ" বলে), তাই প্রকৃত রাউন্ড সংখ্যা তাত্ত্বিক লগারিদমিক আদর্শের সামান্য বেশি হয়।

  2. চিন্তা করুন: কেন বাস্তব গসিপ প্রোটোকল সাধারণত প্রতি রাউন্ডে ১টি নয়, বরং ৩টি র‍্যান্ডম নোডকে জানায়? এর সুবিধা ও খরচ কী?

    একাধিক (যেমন ৩টি) নোডকে জানালে তথ্য দ্রুত ছড়ায় এবং কোনো একটি টার্গেট নোড ডাউন থাকলেও (মেসেজ হারিয়ে গেলেও) বাকি ২টি টার্গেট তথ্যটি পেয়ে যাবে — অর্থাৎ ফল্ট-টলারেন্স বাড়ে। খরচ হলো প্রতি রাউন্ডে নেটওয়ার্ক ট্রাফিক ৩ গুণ বেড়ে যায় — এটি একটি ক্লাসিক ট্রেড-অফ: দ্রুত ও নির্ভরযোগ্য প্রপাগেশন বনাম কম নেটওয়ার্ক খরচ।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
কোরাম রিড/রাইট