Kafka 可以理解成一个高吞吐、可持久化、可横向扩展的消息中间件。
最简单的结构是:
Producer -> Kafka Broker -> Consumer
生产消息 存储消息 读取并处理消息
如果把 Kafka 想成一个物流系统:
- Producer 是发货的人。
- Broker 是中转仓库。
- Consumer 是收货并处理包裹的人。
- Topic 是不同类型货物的分类。
- Partition 是同一个分类下的多个货架。
- Offset 是货架上一件货物的编号。
Kafka 的作用是什么
Kafka 最核心的作用是:解耦、削峰填谷、持久化事件流。
比如推荐系统里,用户会不断产生行为:
曝光
点击
点赞
收藏
评论
关注
下单
这些行为不能每来一条就同步通知所有下游系统。否则推荐主链路会被拖慢,下游任何一个系统变慢,也会反过来影响用户请求。
更合理的方式是先把事件写入 Kafka:
用户点击视频
-> 日志服务把点击事件写入 Kafka
-> 实时特征任务消费 Kafka,更新用户短期兴趣
-> 数据仓库任务消费 Kafka,做离线分析
-> 风控任务消费 Kafka,识别异常行为
-> 模型训练任务消费 Kafka,生成训练样本
这样推荐服务只需要快速把事件写出去,不需要等待所有下游处理完。
这就是 Kafka 的价值:
- 解耦:生产者和消费者互相不依赖。
- 削峰:流量高峰时先堆在 Kafka,消费者按自己的能力慢慢处理。
- 持久化:消息会存到磁盘,消费者挂了也可以恢复后继续读。
- 广播给多系统:同一份用户行为日志可以被多个业务系统使用。
生产者 Producer 是什么
Producer 就是生产消息、写入 Kafka 的系统。
常见生产者:
- 推荐服务。
- 日志采集服务。
- 订单服务。
- 埋点 SDK。
- 后端业务服务。
一条用户点击消息可能长这样:
{
"user_id": 123,
"item_id": 456,
"event": "click",
"timestamp": 1710000000
}
Producer 会把这条消息发送到某个 Kafka topic,比如:
user_behavior_topic
一句话:
Producer 负责把业务事件变成消息,并写入 Kafka。
Broker 是什么
Broker 是 Kafka 的服务器节点。
一个 Kafka 集群通常由多个 Broker 组成:
Kafka Cluster
Broker 1
Broker 2
Broker 3
Broker 负责:
- 接收 Producer 发来的消息。
- 把消息写入磁盘。
- 按 Topic 和 Partition 管理消息。
- 给 Consumer 提供读取能力。
- 通过副本机制提高可靠性。
可以简单理解成:
Broker = Kafka 的存储服务器 / 消息仓库
消息写进 Kafka 后,不会因为消费者读取了就立刻消失。Kafka 会根据保留策略保存一段时间,比如保存 7 天,或者保存到磁盘空间达到某个上限。
消费者 Consumer 是什么
Consumer 就是从 Kafka 读取消息并处理消息的系统。
常见消费者:
- Flink 实时任务。
- Spark Streaming 任务。
- 实时特征服务。
- 数据仓库同步任务。
- 风控任务。
- 搜索索引更新任务。
- 推荐训练样本构造任务。
比如实时特征服务消费点击事件:
读到 user_id=123 点击 item_id=456
-> 更新用户最近点击类目
-> 更新用户短期兴趣
-> 更新用户最近活跃时间
-> 写入 Redis / 特征存储
一句话:
Consumer 负责从 Kafka 读取消息,然后完成自己的业务逻辑。
“消费”是什么意思
消费就是:消费者从 Kafka 读取消息,并处理这些消息。
比如 Kafka 里有三条消息:
offset=0 用户 A 点击视频 1
offset=1 用户 B 点赞视频 2
offset=2 用户 A 收藏视频 3
消费者会按顺序读取并处理:
读 offset=0
-> 更新用户 A 的点击特征
读 offset=1
-> 更新用户 B 的点赞特征
读 offset=2
-> 更新用户 A 的收藏特征
这里要注意:消费消息不等于删除消息。
Kafka 的消息通常还会继续保留。消费者只是记录自己读到了哪里,这个位置叫 offset。
Topic 是什么
Topic 是消息的逻辑分类。
比如:
user_behavior_topic 用户行为日志
order_event_topic 订单事件
recommend_log_topic 推荐日志
payment_event_topic 支付事件
Producer 往某个 topic 写消息,Consumer 从某个 topic 读消息。
可以理解成:
Topic = 一类消息的名字
Partition 是什么
一个 topic 可以拆成多个 partition。
例如:
user_behavior_topic
partition 0
partition 1
partition 2
Partition 的作用是提高并发能力。
如果一个 topic 只有一个 partition,那么同一时刻能并行处理的能力有限。拆成多个 partition 后,Kafka 可以把数据分散到不同 Broker 上,消费者也可以并行消费。
但要注意:
Kafka 只能保证单个 partition 内部有序,不能保证多个 partition 之间全局有序。
如果想保证同一个用户的行为有序,可以用 user_id 作为 key,让同一个用户的消息进入同一个 partition。
key = user_id
这样用户 A 的行为会进入同一个 partition,在这个 partition 内按顺序消费。
Offset 是什么
Offset 是消息在 partition 里的编号。
例如:
partition 0:
offset 0 用户 A 点击
offset 1 用户 B 点赞
offset 2 用户 C 收藏
Consumer 通过 offset 记录自己消费到哪里了。
如果消费者处理到 offset 100 后挂了,重启后可以从 offset 101 继续读。
这也是 Kafka 能支持失败恢复的原因之一。
Consumer Group 是什么
Consumer Group 是一组消费者。
同一个 Consumer Group 里的多个消费者会共同消费一个 topic。
例如:
user_behavior_topic 有 3 个 partition
Consumer Group: feature_job
Consumer 1 消费 partition 0
Consumer 2 消费 partition 1
Consumer 3 消费 partition 2
这样可以提高消费速度。
同一个 partition 在同一个 Consumer Group 内,同一时刻只会分配给一个 Consumer。这样可以避免同一组里的多个消费者重复处理同一条消息。
但不同 Consumer Group 之间互不影响。
例如:
feature_job 消费用户行为,更新实时特征
warehouse_job 消费用户行为,写入数仓
risk_job 消费用户行为,做风控检测
它们可以同时消费同一个 topic,各自维护自己的 offset。
推荐系统里的完整例子
以抖音推荐里的点击事件为例:
用户点击视频
-> 推荐服务生成 click event
-> Producer 写入 user_behavior_topic
-> Kafka Broker 持久化消息
-> Flink Consumer 消费消息
-> 更新用户实时兴趣特征
-> 特征写入在线特征存储
-> 下一次推荐请求使用新特征
这条链路里:
- 推荐服务是 Producer。
- Kafka 集群里的机器是 Broker。
- Flink 实时任务是 Consumer。
- 读取并处理点击事件的过程叫消费。
user_behavior_topic是 Topic。- Topic 下面的多个分片是 Partition。
- 每条消息在 Partition 里的编号是 Offset。
面试怎么一句话总结
可以这样说:
Kafka 是一个分布式消息队列,核心作用是把生产者和消费者解耦,并承接高吞吐事件流。Producer 负责写消息,Broker 负责存储和分发消息,Consumer 负责读取并处理消息。消费不是删除消息,而是消费者读取消息后提交 offset,记录自己处理到哪里。
放到推荐系统里:
Kafka 常用于承接用户行为日志,把在线推荐、实时特征、离线数仓、模型训练、风控等系统解耦起来。
容易混淆的点
- 消费不是删除消息。Kafka 消息会按保留策略保存,消费者只是提交 offset。
- Topic 是逻辑分类,Partition 是物理分片。
- 单个 Partition 内有序,多个 Partition 之间不保证全局有序。
- 同一个 Consumer Group 内,一个 Partition 同时只会被一个 Consumer 消费。
- 不同 Consumer Group 可以各自独立消费同一个 Topic。
把这些概念讲清楚之后,再去背 Kafka 为什么快、如何保证不丢、如何保证顺序,就会顺很多。