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

设计短网址服务

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

EN →

这一章讲什么?

你在社交平台上贴一条长得吓人的链接,发出去往往变成七八个字符的小尾巴。《System Design Interview》第 8 章就是让你从零造出这么一个服务:把长网址换成短网址,再在有人点击时把他送回原处。题面小得像道作业题,骨架却最清楚——一张对照表、一个发号器、一层缓存,大系统的三大件全在里面。

打个比方

把它想成商场的寄存处:你把厚大衣(长网址)交过去,柜台给你一张小小的号码牌(短网址)。号码牌上没有任何关于大衣的信息——它薄薄一张,全靠柜台那本账本把号码和大衣一一对上。所以这门生意的全部本事就两件:发牌子的规矩,和那本永远不能弄丢的账本。

难的从来不是「变短」

难点在三个要求同时成立:牌子要短到人能顺手抄下来(七个字符上下);十年下来几千亿张牌一张也不能重号;而且几个发牌柜台之间最好别互相打招呼——一问一答就慢了。

还有个容易被忽略的性质:这门生意是极端的写一次、读很多次。一条链接登记一次,可能被点上万次。设计的重心因此天然压在「被点击」那一侧,而不是「被创建」那一侧。

牌子怎么发:两种发法

第一种,把大衣揉出一个指纹:对长网址算一个特征值,截前七位当牌号。快,但两件不同的大衣可能算出同一个指纹——撞上了就改一改重算,直到不撞为止。

第二种,先领个流水号,再换种写法:柜台按顺序发 1、2、3……然后把这个十进制数字改写成一种更省位数的记法——只用 0-9、a-z、A-Z 这 62 个符号(就像把十进制写成十六进制,符号多了、位数就短了)。62 个符号排七位,能表示三万五千亿个牌号,够用几百年。

柜台边那一摞常用牌

既然一万次点击才对应一次登记,柜台不必每次都翻账本:把最近最常被问到的那些「号码牌—大衣」对应关系抄一份放在手边,绝大多数人来了当场就能答上,只有冷门号码才去翻账本。这一摞抄本就是缓存,而它答上来的比例,几乎直接等于你的服务器账单。

还有个藏在细节里的选择

把人送走的时候,你可以说两种话。说「这地方永久搬走了」——浏览器会记住,下次他直接飞过去、不再经过你,你省了机器;但你也永远数不到这次点击。说「暂时去那边一趟」——每次点击都还得经过你,你能完整记下谁在什么时候点了什么,代价是这些流量全得自己扛。要数据还是要省钱,只能挑一个。

诚实说一句代价:这本账本你得永远维护下去——服务一旦关停,全世界散落各处的短链会在同一天集体变成死链。

一句话记住

短网址服务的本质是一本不能丢的账本:发牌要短且不重号,读远多于写所以缓存决定成本,而跳转时说「永久」还是「暂时」,就是在省服务器和要点击数据之间二选一。

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