专业书籍精读 · System Design Interview 卷一 · 第 10 章

设计通知系统

System Design Interview Vol 1 · Ch 10 · Alex Xu · 2020

EN →

这一章讲什么?

手机屏幕上弹出的那一条「你的包裹已派送」「有人回复了你」,背后是一整套通知系统。这一章讲怎么把它造出来——听起来像件小事,其实是全书里最典型的一堂课:你要负责的事情,最关键的那一步却不在你手里。

打个比方:三个不听你指挥的邮差

把通知系统想成一个快递总站。信是你写的,但最后一公里必须交给三家外包邮差:给苹果手机送的(苹果家)、给安卓手机送的(谷歌家)、发短信的(运营商)。麻烦在于,这三家只认自己的规矩:

苹果家说:人不在家时,我只帮你留最新的那一封,之前的直接扔;谷歌家说:我最多帮你存 100 封,超了全扔,而且存四个星期没送出去也扔。它们还都不给你「本人已签收」的回执——只告诉你「信我收下了」。

旧办法为什么撑不住

最朴素的做法:下单成功后,代码顺手就去敲邮差的门,等他回话再往下走。三个坏处一个比一个疼:邮差回话慢一秒,你的下单接口也跟着卡一秒;负责跑腿的那台机器一挂,所有通知凭空蒸发;大促当天通知涨了几十倍,你想加人手都插不进去。

核心办法:中间加一条传送带

做法是在中间放一条传送带。业务那边只管把「要发什么、发给谁」丢上传送带就走人,几毫秒的事;传送带另一头站着一排工人,慢慢取、慢慢跑腿。这样邮差再慢也慢不到你的主流程上。

关键是传送带要按邮差分开:苹果一条、安卓一条、短信一条、邮件一条。短信那家今天堵了,只堵短信这一条,推送照跑;短信忙不过来,就只给短信那条加工人。一条堵死不牵连另外三条,这是整章最值钱的一句话。

还得管三件小事

光有传送带不够,还有三件必须自己管住的事:开关——发之前先查这个人愿不愿意收这类通知;编号——每封信贴一个唯一编号,工人送之前查一下「这个号送过没」,送过就扔掉(因为跑腿失败要重试,重试就一定会重复);上限——每人每天最多几封。第三件最容易被忽略,代价却最狠:用户被烦到把通知权限一关,你以后连「支付成功」都送不到了,而且这扇门他多半不会再打开。

诚实的代价:加了传送带,通知就不再是「立刻」——正常几百毫秒到几秒,堵车时可能几分钟;而且你只能做到「至少送到一次」,重复得靠编号自己挡。

一句话记住

通知系统难的不是「怎么发出去」,是最后一公里在别人家:三方通道不保证送达、也不保证只送一次。你唯一能管住的是自己这一侧——用传送带把业务和跑腿隔开、按通道各走各的、每条信编个号防重复,以及别把用户烦到关掉开关。

想进到具体架构、投递语义与示意图? → 切到精读版