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

Source: https://www.geekswithgeeks.com/hi/system-design/sd-design-chat

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

## आवश्यकताएँ

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

## कनेक्शन परत

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

## मैसेज प्रवाह

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

```text
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
```

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

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