专业书籍精读 · System Design Interview 卷二 · 第 8 章

设计分布式邮箱服务

System Design Interview Vol 2 · Ch 8 · Alex Xu & Sahn Lam · 2022

EN →

这一章讲什么?

你每天打开的 Gmail、QQ 邮箱、公司邮箱,背后要同时给十亿个人各管一个信箱:收得下、找得到、换台手机还得一模一样。这一章就是把「造一个这样的邮箱服务」从头到尾走一遍。

先说个怪事

邮件的收发规矩是 1980 年代定下来的,四十年几乎没改过,照着做就行。可这一章依然是全书最重的几章之一——因为难的从来不是「怎么把信送过去」,是「送到之后往哪儿放、以后怎么找回来」。邮箱本质上不是通信系统,是个超大仓库。

旧世界为什么难

早年的邮件服务器很朴素:一台机器,每个人的信就堆在这台机器上的一个文件夹里。人一多就全线崩塌——一天新进来的信就能把一台机器塞满;机器一挂,这批人集体失联;而且邮件几乎不许删(法务、审计都要求留着),只进不出。

还有件反直觉的事:真正压垮系统的往往不是「收信」,而是你随手点的那些小动作。标个已读、加个标签、拖进归档——每一下都是一次写入。你一天读 40 封,就至少有 40 次这种写。

核心的几个点子

① 一人一格。邮箱有个别的系统羡慕不来的好处:没人会去查别人的信箱。所有操作天然只关一个人的事。于是把仓库按人切成一格一格,任何一次读写都只碰一格——那些「要协调好几台机器才能办成一件事」的麻烦,直接不存在了。

② 信和包裹分开放。正文很轻(几行字),附件很重(几百 KB 到几十 MB)。所以附件送进旁边的大仓库,信箱格子里只留一张取件单。这样翻收件箱的时候,不会被一堆大包裹拖慢。

③ 每人一本自己的目录。搜邮件和上网搜东西完全是两回事:搜网页是十亿人查同一本大目录;搜邮件是十亿本小目录,每本只服务一个人。你那本薄得很,所以能做到「一秒前刚到的信,现在就搜得着」。

④ 门口收发员只管签收。外面的信送上门,门口不能让人家在门外干等——先签个字收下,扔进传送带;查毒、拦垃圾、分拣归档这些慢活,在传送带后头慢慢干。

代价在哪

一封信实际上被写到了三个地方:信箱、大仓库、目录本。所以删一封信要删三处,而这三处在短时间内可能对不上——你删了,搜索里可能还残留一会儿。

一句话记住

邮箱服务的难点不在「送信」,在「存和找」。它最大的本钱是没人查别人的信箱:按人把仓库切成一格一格,重活就都变成了一格之内的事;重附件挪去旁边的大仓库,目录本每人一册。代价是一封信散在三处,删改时短时间内会对不齐。

想进到具体机制、记号和示意图? → 切到精读版