IT 论文精读 · PAPER 58

Kafka:为日志处理而生的分布式消息系统

Kreps, Narkhede & Rao · LinkedIn · NetDB 2011

EN →

这篇论文干了什么?

2011 年,LinkedIn 的三位工程师发了一篇只有七页的短论文,介绍他们自造的 Kafka。它是公司内部的一条数据主干道:所有服务器产生的动静(谁点了什么、谁搜了什么、哪台机器 CPU 高了)都往这条道上扔,需要的人再从道上自取。今天从电商的订单状态到银行的实时风控,背后大多跑着 Kafka 或它的模仿者。

旧世界的痛

稍大的网站每天产生的行为流水——每一次点击、刷新、划过——比订单账户这类「正经数据」多好几个数量级。当年处理它只有两条路。

一条是传统消息队列,像个讲究的邮局:每封信挂号、签收、登记谁取走了,取走即销毁。稳妥,可光记这些账就贵得扛不住量。另一条是日志搬运工:每台机器把日志攒着,定时打包搬进大仓库集中算——量扛得住,可搬一趟要几小时,等算出「这人可能想看什么」,人早走了。

要快的没有量,有量的不够快。

点子:别当邮局,当合订本

Kafka 反过来:服务器不再替任何人记账。

它把消息写成一本一直往后翻的流水账——来一条就在末尾添一行,从不修改、从不插页。谁想读,自己记住读到第几行,下次接着往下读。读过的内容不会消失,本子按时间到期(比如七天)才整段扔掉。

于是「一条消息只能被取走一次」这条天经地义的规矩没了:搜索的读它、推荐的读它、报表的半夜读它,各拿各的书签、互不打扰。程序出了 bug?书签往回拨几页重读一遍就是。

那它凭什么快

一是只往末尾添行。硬盘最怕东一榔头西一棒子地找地方,最擅长一路往下写。

二是服务器不记账。「谁读到哪儿」原本是最烦的一本账,每条消息都要记状态、还要建索引翻查。丢给读者自己保管后,服务器只剩两件事:往后添、按行号取。

三是取的时候不绕路。读者说「从第几行起给我一段」,服务器就把那段字节直接推进网线,不先搬进自己内存倒一手。

四是一本拆成多本。同一话题的账本拆成几本、分放不同机器,就能同时写、同时被读。

诚实说一句代价:论文里的 Kafka 每条消息只存一份,那台机器硬盘彻底坏了,还没被读走的消息就永远没了(多存几份是后来才补的)。

带来了什么

「日志」从没人管的副产品变成整家公司数据的主干道:一份流水摆在那儿,谁想用就接上去读,新接一个系统不必再惊动上游。今天但凡讲「实时数据」「事件驱动」的系统,大多照这个样子搭。

一句话记住

把消息中转站从「替人记账的邮局」改成「一本只往后添、按期作废的流水账」:服务器不管谁读到哪儿、书签由读者自己拿——于是又快、又能多方共读、还能倒带重放。

想看它的架构图、offset 与零拷贝机制、以及实测数字? → 切到精读版