पाठ 28 / 32

एक चैट एप्लिकेशन डिज़ाइन करें

स्केल पर रीयल-टाइम डिलीवरी, प्रेज़ेंस और मैसेज इतिहास।

आवश्यकताएँ

1:1 और ग्रुप मैसेजिंग, ऑनलाइन होने पर ~100ms के भीतर डिलीवरी, ऑफ़लाइन यूज़र को रीकनेक्ट पर संदेश मिलें, मैसेज इतिहास, ऑनलाइन/टाइपिंग इंडिकेटर। मानें 50M DAU, हर एक 40 संदेश/दिन भेजता है।

कनेक्शन परत

क्लाइंट कनेक्शन-गेटवे सर्वर से एक स्थायी WebSocket रखते हैं। एक रजिस्ट्री (Redis) user_id -> गेटवे सर्वर मैप करती है ताकि कोई भी बैकएंड जान सके संदेश कहाँ पुश करना है। ऑफ़लाइन यूज़र को भेजना बस बाद की डिलीवरी के लिए उनके इनबॉक्स में लिखना है।

मैसेज प्रवाह

राइट पथ: संदेश को स्थायी करें, फिर प्राप्तकर्ता के सक्रिय कनेक्शन को फ़ैन आउट करें यदि ऑनलाइन हो।

send(msg):
  db.append(conversation_id, msg)   # source of truth
  gw = registry.lookup(recipient_id)
  if gw: gw.push(msg)               # online
  else: queue.push(offline_inbox)   # deliver on reconnect

Output:

DB write is the durability guarantee; push is best-effort

सीक्वेंस नंबर से क्रम और डुप्लिकेट हटाना

हर संदेश को प्रति-बातचीत एक सीक्वेंस नंबर दें ताकि क्लाइंट गैप पहचान सकें (गुम को फ़ेच करें) और रिट्राई किए गए भेजने को डुप्लिकेट हटा सकें — नेटवर्क की गड़बड़ी से यूज़र जो देखता है उसका क्रम या दोहराव नहीं बिगड़ना चाहिए।