P97 Kafka 是 pull?push?优劣势分析
面试题:Kafka 用 pull(拉)还是 push(推)?为什么?有什么优缺点?
1. 答案
Kafka 消费者用 pull(拉取)模式,不是 push。
2. 为什么用 pull
push 的问题
- 压垮慢消费者:Broker 推送速率由自己决定,消费者处理不过来时消息积压在消费端内存,最终 OOM/丢消息;
- 不好做背压:无法感知消费者能力;
- 消费者需要攒批/顺序控制时很被动。
pull 的好处
- 消费者自己控制消费速率:处理得慢就少拉,天然背压;
- 可以批量拉取:攒够一批再处理,吞吐高;
- 灵活:想拉多少、什么时候拉由消费者决定;
- 实现简单:Broker 只管存,消费者主动取。
3. pull 的缺点
- 空轮询:没有新消息时消费者空转(busy loop),浪费 CPU;
- 解决:
poll(timeout)参数,超时等待,不立即返回;
- 解决:
- 延迟:消息到了但消费者没拉,实时性不如 push;
- 解决:短轮询 + 长轮询(fetch.wait.max.ms),延迟可接受;
- 管理复杂:消费者要自己维护 offset。
4. 对比
| 模式 | 优点 | 缺点 |
|---|---|---|
| pull | 速率可控、批量、背压天然 | 空轮询、实时性略差 |
| push | 实时性好、Broker 主动 | 压垮消费者、无背压 |
5. 加分点
- 对比 RabbitMQ:RabbitMQ 的消费也是 pull 语义(消费者主动获取,prefetch 控制),但很多框架封装得像 push;
- 提到 long-polling:Kafka 的
fetch.max.wait.ms+fetch.min.bytes让拉取在"有数据或超时"时返回,兼顾实时性和效率; - 追问"什么场景 push 更好":物联网、实时告警等低吞吐、高实时场景;
- 提到 Kafka 的高吞吐正是"批量 + 拉取"的组合结果。
一句话总结
Kafka 用 pull 模式:消费者自主控制速率(天然背压)、支持批量拉取,用 poll(timeout)/长轮询解决空转和延迟问题;push 实时性好但会压垮慢消费者,所以 Kafka 选择 pull 换高吞吐和稳定性。