系统设计面试:设计一个即时通讯系统(WhatsApp/微信)

设计一个像 WhatsApp 或微信的即时通讯系统,是系统设计面试的常考题。

核心需求

  • 一对一聊天和群聊
  • 消息可靠性(不能丢消息)
  • 在线状态
  • 历史消息
  • 支持 10 亿用户

架构概览

客户端 ←→ WebSocket 长连接 ←→ 聊天服务
                                    ↓
                              消息队列(Kafka)
                                    ↓
                              消息存储(HBase/Cassandra)

为什么用 WebSocket 而不是 HTTP 轮询

HTTP 轮询延迟高、浪费带宽。WebSocket 建立长连接后服务端可以主动推送消息。但 HTTP 用于发送消息是可以的(更简单)。

消息可靠性

  1. 客户端发送消息 → 服务端返回 ACK
  2. 服务端存储消息并推送给接收方
  3. 接收方返回 ACK
  4. 如果没收到 ACK,服务端重试

对于群聊,只需存储一份消息,用「收件箱」模式——每个用户有一个消息队列。

在线状态

用户每 30 秒发送心跳。服务端记录最后心跳时间。超过 1 分钟没心跳标记为离线。

存储选型

  • 消息体:HBase 或 Cassandra(按时间排序的高吞吐写入)
  • 用户关系和群组:MySQL
  • 图片/视频:对象存储(S3/OSS)+ CDN
  • 最近消息列表:Redis

扩展

  • 端到端加密(WhatsApp 的 Signal 协议)
  • 消息已读状态
  • 撤回消息
  • 多设备同步

即时通讯看着简单,做到亿级用户且不丢消息非常复杂。

关于 Zihao Zhang

后端开发工程师。关注 Java/Spring Boot/Redis/MySQL 技术栈,分布式系统,OLAP 数据库,AI Agent 开发与应用。

评论

评论已关闭。