设计一个聊天系统
网络高度发达的今天,聊天系统非常常见,聊天系统看似简单,但从头做一个聊天系统并不简单!
明确需求
- 是否支持单聊?
- 是否支持群聊?群聊人数限制是?
- 消息类型是否包含富文本(音频、视频、图片)?
- 文本消息长度限制是?
- 是否需要端到端加密?
- 客户端是否包含移动设备 APP?
- 客户端是否包含Web APP?
- 是否支持同时登录多设备?
- 是否支持显示在线状态?
- 是否支持离线 Push 消息通知?
- DAU(daily active users)多少?
消息发送者、消息接收者和消息服务之间的关系

客户端与服务器之间通信机制
HTTP Polling

HTTP Long polling

WebSocket
服务模块设计

弹性服务设计

数据模型
单聊消息

群聊消息

设计细节
服务发现

发送消息流程
单聊消息

多设备消息同步

群聊消息
在线状态
用户登录

用户退出

心跳检测

好友视角

参考
- 《System Design Interview - An Insiders Guide》by Alex Xu, Chapter 12 - Design A Chat System
- 从无到有:微信后台系统的演进之路
- 5 亿用户如何高效沟通?钉钉首次对外揭秘即时消息服务 DTIM