Week 3 · Chapter 3 · Kafka / RocketMQ
复习难度:⭐⭐⭐ | 预计时长:3-4小时 | 重点程度:中
Kafka 核心概念
Producer → Topic(逻辑概念) → Partition(物理存储单元)
→ Replica(副本,同步/异步复制)
Consumer → Consumer Group(消费组)
组内竞争(一条消息只被一个消费者消费)
组间独立(同一消息可被多个组消费)
分区与顺序消息
一个分区内消息有序
跨分区:无序
如何保证全局有序?
→ 只设置1个 Partition(但失去并行能力)
→ 按某个字段 Hash 到固定 Partition(同一字段的消息有序)
消息可靠性
acks 配置
acks=0:发送即成功(丢消息,效率最高)
acks=1:Leader 副本写入成功即回复(可能丢消息)
acks=all/-1:ISR 全部写入成功(最强可靠)
ISR(In-Sync Replicas)
ISR = 与 Leader 保持同步的副本集合
min.insync.replicas = 2(至少2个副本同步才算成功)
副本长时间不同步 → 踢出 ISR
Leader 挂了 → 从 ISR 中选举新 Leader
消费模式
消费者组
Consumer Group A:[C1, C2] → Topic 有 4 个 Partition
C1 消费 [P0, P1]
C2 消费 [P2, P3]
→ 负载均衡
增加 Consumer:
C3 加入 → 自动 rebalance → C1 消费 [P0], C2[P1,P2], C3[P3]
消费积压处理
现象:Lag(消费滞后)持续增长
原因:
1. 消费者处理慢(代码问题)
2. 消费者实例减少(机器挂了)
3. 消费者实例 < Partition 数量
处理:
1. 增加消费者实例(不超过 Partition 数)
2. 增加 Partition 数(影响已有消息顺序)
3. 消费者端加监控,告警
RocketMQ(阿里消息队列)
对比 Kafka
| Kafka | RocketMQ | |
|---|---|---|
| 延迟 | 毫秒级 | 毫秒级 |
| 事务消息 | 无原生支持(事务Kafka有) | 原生支持 |
| 延迟消息 | 不支持 | 支持(定时/延迟消息) |
| 顺序消息 | 单 Partition 有序 | 支持严格顺序 |
| 消费模式 | 拉的模式 | 拉的模式(但支持推) |
延时消息(审批催办场景)
// RocketMQ 延时消息:审批单超时未处理,自动催办
// 设置延时级别(1s/5s/10s/30s/1m/2m...)
_, err = rocketMQClient.SendDelayedMsg(ctx, "ORDER_TIMEOUT_TOPIC", msg, 3) // 10s后投递
高频面试题
Q1:Kafka 如何保证消息不丢失?
三处都需要配置: ① Producer:acks=all + retries=3 + 幂等发送 ② Broker:replication.factor=3 + min.insync.replicas=2 ③ Consumer:关闭自动提交,改为手动提交 offset
Q2:Kafka 如何保证消息不重复(幂等)?
① Producer 开启幂等(enable.idempotence=true) ② Consumer 端业务幂等(去重表 / 唯一键)
Q3:顺序消息的实现?
Kafka:按 Partition 内的 offset 有序;RocketMQ:MessageQueueSelector 按某个字段(如订单ID)路由到同一队列,实现同一订单的消息有序