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

设计附近的好友

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

EN →

这一章讲什么?

微信有「附近的人」,苹果手机有「查找」,Facebook 当年有个功能叫 Nearby Friends:打开地图,就能看见哪几个朋友现在离你不远,旁边还标着「3 分钟前更新」。这一章就是从零把这个功能造出来。它和上一章的「找附近的餐厅」看着是同一类题,做法却几乎完全相反。

先说个怪事

上一章找餐厅,办法是把全世界的店都编好号、做成一本按地址排序的大账本,你来了就翻账本。这一章要找的是人——人每半分钟就换个位置,账本每秒要改三百多万处,改都改不过来。更怪的是:这一章的正确答案,不是把账本做得更快,而是干脆不做账本。

旧世界为什么难

如果照老办法来,你的手机每半分钟就得问服务器一次「我那几百个朋友现在都在哪」,服务器再挨个去账本里翻。一亿人一起这么问,服务器忙不过来,而你的手机电池撑不到中午——Uber 早年就是这么干的,他们后来公开说:老让手机主动去问,最先垮掉的是电量。

核心的点子:不去找,改成订

把每个人想象成一个小广播频道。你和你的几百个朋友各开一个频道,你订了他们的,他们也订了你的。谁挪了位置,就在自己频道里喊一声「我到这儿了」——只有订了他频道的人听得见。没人再去翻账本,位置自己会送上门。

那距离谁来量?听见的那一端自己量。朋友喊了一声,你这边的服务器听见了,拿尺子一比:他离我五英里以内吗?在就显示,不在就当没听见。这样系统不必回答「全城谁离谁近」这种大问题,只需要一遍遍回答「他离我近吗」这种小问题。

位置写在会褪色的便签上。每个人的当前位置只写一张便签,四十秒就自己消失。好处很妙:一个人关掉 App、进了电梯、手机没电,他那张便签四十秒后自动没了,朋友的地图上他就自然淡出——不需要任何人专门去打扫。

该怎么选

这套办法成立的全部前提是:你要找的那几百个人是谁,事先就知道。所以它只管得了「好友」。要是你想找身边的陌生人——那是谁事先没人知道的——就还得搬回上一章那本大账本。真实产品里两套是并存的。

代价也很实在:手机得和服务器一直连着一根线,连接本身就要占资源,连服务器发个新版本都得等旧的线慢慢散场。

一句话记住

找朋友在哪,别去搜——让每个人开一个广播频道,谁动了自己喊,听见的人自己量距离。位置写在四十秒自动消失的便签上,人一掉线就自然从地图上淡出。找陌生人,才需要上一章那本大账本。

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