WhatsApp-এর মতো chat অ্যাপ ডিজাইন

Chat-এ কম latency, নির্ভরযোগ্য delivery এবং লক্ষ লক্ষ খোলা connection লাগে। ধাপে ধাপে ডিজাইন দেখি।

ফোন ও server-এর মধ্যে চলা chat বাবল

লক্ষ্য: user এক-থেকে-এক ও group-এ real-time টেক্সট message পাঠায়, সাথে delivery status।

Requirement

  • এক-থেকে-এক ও group chat, sent/delivered/read status সহ।
  • Message হারাবে না, আর chat-এর ভেতরে ক্রম থাকবে।
  • Offline user ফিরলে message পাবে।
  • কম latency (এক সেকেন্ডের অনেক কম) এবং অনেক একসাথে connection।

অনুমান

ধরুন ৫ কোটি দৈনিক user, প্রত্যেকে দিনে ৪০টি message: দিনে ২০০ কোটি message, গড়ে প্রায় ২৩,০০০ message/s। প্রতিটি ১০০ byte হলে দিনে প্রায় ২০০ GB টেক্সট। Media (ছবি, voice) যায় object storage-এ, message-এ শুধু রেফারেন্স।

Connection

প্রতিটি online user একটি chat server-এ WebSocket ধরে রাখে। একটি server কয়েক লাখ connection ধরতে পারে। একটি session service (Redis) user -> chat server ম্যাপ রাখে, তাই কোথায় পৌঁছাতে হবে জানা যায়।

Message পাঠানো (এক-থেকে-এক)

  1. প্রেরকের অ্যাপ WebSocket দিয়ে নিজের chat server-এ message পাঠায়, সাথে client-এর বানানো message ID।
  2. Server message টেকসইভাবে সংরক্ষণ করে (প্রেরককে ack দেয়: "sent")।
  3. প্রাপকের chat server খুঁজে এগিয়ে দেয়। প্রাপক online হলে socket দিয়ে push হয় ও সে "delivered" ack পাঠায়।
  4. প্রাপক offline হলে message storage-এ থাকে এবং push notification যায়। ফিরে এলে অ্যাপ শেষ message ID-র পরের সব sync করে।

ক্রম ও ডুপ্লিকেট

প্রতি কথোপকথনে server-এর দেওয়া sequence number বা সময়-ক্রমিক ID দিয়ে সাজান। Ack হারাতে পারে ও client retry করে, তাই message ID পাঠানোকে idempotent করে এবং ডুপ্লিকেট ঠেকায়।

Storage

Write-ভারী এবং কথোপকথন ও সময় অনুযায়ী ক্রমিক। conversation_id দিয়ে partition করা wide-column বা key-value store মানায় (Cassandra, DynamoDB ধাঁচ)। সাম্প্রতিক message গরম রাখুন, পুরোনো archive করুন।

Group chat

পাঠানোর সময় server প্রতিটি সদস্যের inbox-এ message ছড়িয়ে দেয়। ছোট group-এ write-সময়ের fan-out ঠিক। খুব বড় group-এ একবার রেখে সদস্যরা নিয়ে নেয়।

অন্যান্য বিষয়

  • Presence (online/শেষ দেখা): heartbeat, Redis-এ ছোট মেয়াদে রাখা।
  • End-to-end encryption: server এমন ciphertext রাখে ও পাঠায় যা সে পড়তে পারে না; key থাকে device-এ।
  • Media: presigned URL দিয়ে object storage-এ upload, লিংক পাঠান।

মূল কথা: WebSocket gateway, session map, আগে টেকসই সংরক্ষণ তারপর delivery, idempotency-র জন্য client message ID, এবং কথোপকথন-ভিত্তিক ক্রম।


System Design সিরিজ, পর্ব ৩ (case study): 3 নম্বর (মোট 16)। আগের লেখা: Pastebin ডিজাইন: টেক্সট রাখা ও শেয়ার করা.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া