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

设计广告点击聚合

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

EN →

这一章讲什么?

你在手机上刷到一条广告,随手点了一下——就这一下,广告主要为它付钱给平台。全世界每天有十亿次这样的点击。这一章讲的就是:怎么把这十亿次点击,数成一份没人能挑出错的账单。

先说个怪事

听上去这不就是「计数」吗,按一下加一,小学生都会。可一旦数字直接变成钱,性质就整个变了:它不是码表上的读数,是收银机里的账。码表少跳一格没人在意;收银机少收一笔,月底就对不上。这一章之所以难,全难在这个身份切换上。

旧世界为什么难

难在三件事。太多:平均每秒一万次、高峰五万次,一台机器数不过来,得拆给几十台一起数、最后再汇总。会迟到:你在地铁里点了广告、信号断了,手机等出了站才把这条记录发出去——它可能晚三分钟,也可能晚三小时。这一下到底该算进「刚才那一分钟」,还是「现在这一分钟」?会重复:网络抖一下,手机没收到确认就再发一遍,同一次点击被数两遍,广告主就被多收了钱。

它怎么做到的

先记流水账。点击一进来不急着算,先原封不动排成一长队存下来——像超市把每张小票的存根都留着。以后算错了、口径改了,把存根重新过一遍就行。

按分钟分抽屉。不去维护「总数」这么一个一直在变的数,而是给每一分钟准备一个抽屉,每次点击落进它出生的那一分钟。抽屉首尾相接、互不重叠,所以同一次点击不会被数进两个抽屉。

给迟到的留宽限期。一分钟过完不立刻封箱,再多等三分钟——像末班车再等三分钟才开。绝大多数迟到的都赶得上;实在赶不上的,夜里统一补账。

每张小票编号。每次点击出生时就带一个全世界唯一的编号,收下之前先看这个号见没见过,见过就扔掉。这样同一条发一百遍,也只算一次。

该怎么选

快和准在这里是对着干的:宽限期留得越长,迟到的点击追回来越多、账越准,可结果也出得越晚——广告主盯着实时报表调出价,等太久就没法用了。所以行业里常见的做法是两条腿走路:几分钟内先出一份「够用的快数」给人看,夜里再拿全部存根重算一份「准数」去结账,两边一对,差得太多就报警。

代价也得说清楚:这套系统从此永远养着两份数字和一条对账线,运维复杂度比「数一个数」高出一个量级。

一句话记住

数点击不是「计数」,是「记账」。所以它先把每一笔原样存下来,再按分钟分抽屉数、给迟到的留宽限期、给每一笔编号防重复,夜里还要拿原始存根重算一遍来对账——快的那份给人看,准的那份用来付钱。

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