Skip to content

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 换高吞吐和稳定性。

基于 VitePress 重建