一句话定义:Kafka 是一个分布式提交日志(distributed commit log)系统。它把事件按到达顺序追加写入磁盘并长期保留,谁需要读取,谁就自己记住读到哪个位置。这套设计使它更像“能回放的流水账”,而不像传统意义上“发完就忘”的消息队列。
原理:从点菜说起
传统消息队列像传菜员:菜送到你手上,盘子就撤了;你没接到,菜就没了。Kafka 则像后厨的一本流水账:每来一单,就在末尾写一行,写完不擦。顾客不慌,只记一句“我读到第 37 行”,下次从 38 行接着读。想重读?把书签往前挪即可。
账本太厚就拆成几本,这就是分区(partition):消息按 key 决定进入哪一本,例如同一个用户的订单永远进入同一本,因此本内严格有序,本与本之间可以并行读写,横向扩容也就从这里来。那个“书签”叫消费位点(offset)。消费者(consumer)自己管理位点,把它往回拨就是重放(replay)。生产者和消费者互不认识,中间只隔着一本不断变长的日志。
和传统消息队列的差别
| 维度 | 传统消息队列 | Kafka |
|---|---|---|
| 消息生命周期 | 消费确认后删除 | 按时间或容量保留,可反复读 |
| 顺序保证 | 队列级 | 分区内有序 |
| 消费方式 | broker 推送并记录状态 | 消费者拉取并自己记位点 |
| 多方消费 | 一条消息通常只给一个消费者 | 多个消费组各读各的,互不影响 |
| 典型定位 | 任务分发 | 数据管道、事件流 |
AI 数据管道为什么爱用它
第一是“一份数据、多方使用”。同一条用户行为日志,可以同时喂给特征工程、离线训练、实时监控和审计,四方各自按自己的速度读,快的不会被慢的拖住。第二是重放:模型迭代要“把过去三个月的数据再过一遍”,传统队列做不到,Kafka 把位点往回一拨就行,这是 AI 场景最刚需的能力。第三是削峰解耦:推理服务、埋点、日志的突发流量先写入磁盘,下游慢慢消化。第四是保序:同一会话的事件不乱序,特征才不会算错。
对从业者的意义
别把 Kafka 当“发消息的”来设计。要关心三件事:key 怎么选(决定分区与顺序)、保留策略留多久(决定你还能不能重训)、位点何时提交(决定是“至少一次”还是可能丢)。对普通人来说,推荐系统的特征刷新、你手机里悄悄上传的行为日志,背后很可能就是它在不停地写入数据。具体配置与行为以官方文档为准。
