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)路由到同一队列,实现同一订单的消息有序