Chat-System-Design-diagram.excalidraw

==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠==

Chat System Design — Architecture Diagram

Text Elements

Client Layer ^clientlabel User A (sender) ^usera User B (recipient) ^userb WebSocket ^ws1 WebSocket ^ws2

Connection Layer ^connlabel Chat Gateway (WebSocket Server) ^gateway Connection Registry / Presence Service ^registry

Message Processing ^msglabel Message Service ^msgservice Message Store (Cassandra) ^msgstore per-channel partitioned by (channel_id, timestamp) ^msgstoreann Message Queue (Kafka) ^kafka ordered per channel partition ^kafkaann

Fanout / Delivery ^fanoutlabel Fanout Service ^fanout queries Connection Registry to route to correct gateway ^fanoutann

Ordering / Delivery Guarantees ^orderlabel Sequence ID Generator ^seqgen monotonic per channel ^seqann Delivery ACK + Retry ^ackretry at-least-once with client dedup ^ackann WebSocket for real-time; Kafka partitioned by channel for ordering; ACK + retry for delivery guarantee ^annotation

Excalidraw Data

Text Elements

Client Layer ^YX9THI62

User A (sender) ^PhBFfF4r

User B (recipient) ^Luhv1NT1

Chat Gateway (WebSocket Server) ^raGJMerQ

Connection Registry / Presence Service ^NlLlljHO

Message Service ^Y3GEjTwP

Message Store (Cassandra) ^C4nHiTcB

per-channel partitioned by (channel_id, timestamp) ^9JPrhWPB

Message Queue (Kafka) ^eRygO7Ie

ordered per channel partition ^WwVbyN4Z

Fanout Service ^qfUJYxIe

queries Connection Registry to route to correct gateway ^JbIwkqLK

Sequence ID Generator ^7bY6LFhC

monotonic per channel ^c0pHXi8Q

Delivery ACK + Retry ^GFhCl600

at-least-once with client dedup ^DBQFprL8

WebSocket for real-time; Kafka partitioned by channel for ordering; ACK + retry for delivery guarantee ^Jm8IGIXv

%%

Drawing

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
 
+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=

%%