设计一个像 WhatsApp 或微信的即时通讯系统,是系统设计面试的常考题。
核心需求
- 一对一聊天和群聊
- 消息可靠性(不能丢消息)
- 在线状态
- 历史消息
- 支持 10 亿用户
架构概览
客户端 ←→ WebSocket 长连接 ←→ 聊天服务
↓
消息队列(Kafka)
↓
消息存储(HBase/Cassandra)
为什么用 WebSocket 而不是 HTTP 轮询
HTTP 轮询延迟高、浪费带宽。WebSocket 建立长连接后服务端可以主动推送消息。但 HTTP 用于发送消息是可以的(更简单)。
消息可靠性
- 客户端发送消息 → 服务端返回 ACK
- 服务端存储消息并推送给接收方
- 接收方返回 ACK
- 如果没收到 ACK,服务端重试
对于群聊,只需存储一份消息,用「收件箱」模式——每个用户有一个消息队列。
在线状态
用户每 30 秒发送心跳。服务端记录最后心跳时间。超过 1 分钟没心跳标记为离线。
存储选型
- 消息体:HBase 或 Cassandra(按时间排序的高吞吐写入)
- 用户关系和群组:MySQL
- 图片/视频:对象存储(S3/OSS)+ CDN
- 最近消息列表:Redis
扩展
- 端到端加密(WhatsApp 的 Signal 协议)
- 消息已读状态
- 撤回消息
- 多设备同步
即时通讯看着简单,做到亿级用户且不丢消息非常复杂。
评论
评论已关闭。