我们每天都在用 WhatsApp。发一条消息,看到勾,收到回复。很容易把即时通讯想成两部手机之间直接发生的事。但在它们之间,有一整套系统。
按下发送之后,消息去了哪里?WhatsApp 怎么找到你要发给的那个人?如果对方离线会怎样?一个勾怎么变成两个?同一条消息被收到两次会怎样?当数百万人同时发消息时,又会发生什么变化?
![]()
这些问题,变成了 What's Up? 这个项目。
从一条消息开始
作者想做一个不一样的系统设计可视化工具。不是从一张庞大的架构图开始,而是从一段 WhatsApp 聊天开始。
Eva 给 Sam 发了一句:Hey
消息离开 Eva 的手机。从这里开始,这个应用让你一步步跟随消息在即时通讯系统内部发生了什么。
消息抵达一台服务器。Sam 的连接可能挂在另一台服务器上。系统需要找到它。如果 Sam 离线,消息需要先被存起来,等他回来。当他重新连接时,消息才能被投递。
然后还有另一个问题:Eva 怎么知道消息已经送达?她又怎么知道 Sam 真的读了?WhatsApp 上那些熟悉的勾,背后是一套大得多的系统。
如果出了错呢?
一条消息可能被再次发送。一个确认可能丢失。一台服务器可能故障。一条连接可能消失。如果请求被重试,系统就必须面对一种可能性:同一条消息到达了不止一次。
这正是消息 ID 和去重之类的东西变得重要的地方。这个应用允许你弄坏系统的某些部分,然后看看缺了它们会怎样。不是只读到“某个组件是必需的”,而是能看到它当初在解决什么问题。
那照片和视频呢?
WhatsApp 消息不总是文字。照片和视频大得多。所以系统需要另一条路径来处理媒体。对象存储可以保存实际文件。CDN 可以帮助投递。消息本身可以携带找到这些媒体所需的信息。因此,一次聊天可能牵涉好几种不同的服务,取决于你发的是什么。
在群里会有什么变化?
发给 Sam 一个人是一回事。发给一个群是另一回事。一条消息可能需要抵达很多人。现在系统就得处理群成员关系、扇出、队列,以及更大规模的投递。同一个聊天气泡,在收件人变多之后,制造出的是完全不同的问题。
大家都在哪儿?
WhatsApp 还会显示在线状态和最后上线时间。这又给系统出了另一个问题:它怎么知道 Sam 是否在线?一个在线状态系统需要持续跟踪不断变化的连接,同时又不能把每一次微小的状态变化都变成一次昂贵的操作。再一次,看起来只是 WhatsApp 界面上的一小块,背后依然站着一套系统。
然后是规模
两个人发消息很容易想象。但 WhatsApp 有数十亿用户,所以系统不能依赖一台服务器或一个数据库。连接需要分布式处理。消息需要路由。数据需要分区和复制。队列可以拆分工作。当单个服务器故障时,服务还得继续运转。架构是从问题里长出来的。
那安全呢?
一个即时通讯系统还必须回答一个更重要的问题:谁能读到这条消息?设计需要把加密纳入考量,对 WhatsApp 而言,端到端加密是安全模型的一部分。这给系统增加了另一道边界。消息仍然需要穿过基础设施。但基础设施不应该变成一个能读到消息的地方。
这就是我想展示的
What's Up? 是一次可视化走查,展示一个 WhatsApp 风格的即时通讯系统可以怎样被设计。它从一条消息开始,逐步引入让消息传递得以运转的各个部分:
- WebSockets,用于持久连接
- 连接管理
- 消息路由
- 离线存储
- 送达与已读确认
- 重试与去重
- 媒体存储与 CDN
- 群组消息
- 队列
- 在线状态
- 数据库
- 分区与复制
- 扩展
- 加密
开头并没有一张巨大的图在等着你。架构随着问题出现而出现。你从一句“Hey ”开始,到最后,你能看见那两个字抵达对面之前,必须先存在的整套系统。
What's Up? 这个名字本身就是那个问题:按下发送之后,到底发生了什么?答案是——相当多。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.