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

设计信息流

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

EN →

这一章讲什么?

你打开朋友圈、微博、领英,往下一直刷——那一列不断冒出来的东西,就叫信息流。这一章讲怎么把它造出来。它看着只是「把朋友发的东西按时间排一排」,其实是全书里最能训练直觉的一道题:同一件事,你可以在写的时候干,也可以在读的时候干,成本会差出几十倍,而且没有哪一边永远划算。

打个比方:报纸是提前印好,还是等你来了现拼?

把每个人的信息流想成一份专属报纸。造它有两种办法。

办法一,提前印。只要有人发了新东西,就立刻跑一趟,往他所有朋友的那份报纸上各补一行。你早上打开时,报纸早就印好躺在那儿,拿起来就走。

办法二,来了现拼。平时什么都不做。你打开的那一刻,编辑才跑去你关注的每个人那里,各抄最新几条回来,拼成一份给你。

旧办法为什么撑不住

「现拼」是最省事的写法,也是最先崩的。你关注了两百个人,每刷新一次就要跑两百趟;只要其中一趟慢了,你就得干等着——拼一份报纸的速度,由最慢的那一趟决定,不是由平均速度决定。用户刷一下要等好几秒,这个产品就没人用了。

核心机制:把活挪到没人等的时候干

所以主流做法是提前印。你发一条,系统马上去查你的好友名单,往每个人的报纸上补一行。读的时候只有一个动作:把印好的那份拿过来。刷新之所以能秒开,是因为工作早在你发帖那一刻就干完了——不是变快了,是挪走了。

但有一个要命的例外

这套办法有个软肋:印的份数等于粉丝数。一个有一亿粉丝的账号发一条,系统要往一亿份报纸上各补一行;就算每秒能印十万份,也要印十几分钟。更亏的是,这一亿人里今天真会来看的可能只有几百万——剩下的全白印了。

于是真实系统按发布者分成两类人:普通人发的,提前印;大明星发的,不印,等你来了现拼。因为你关注的大明星撑死几十个,现拼几十趟很划算。你看到的那份 = 提前印好的那一叠 + 现拼的明星那几条,按时间掺在一起。

诚实的代价:提前印意味着同一条内容在系统里被抄了成百上千份,写入量和存储都翻上去了,而且绝大多数抄件永远不会有人看。

一句话记住

信息流的全部设计,就是在回答一个问题:拼这份报纸的活,放在「有人发帖时」干,还是放在「有人来看时」干?前者读得飞快但写得要命,后者写得轻松但读得难受。答案不是二选一,是按发布者分开处理——普通人提前印,大明星现拼,最后掺在一起。

想进到扇出策略、缓存分层与具体量级? → 切到精读版