订阅更新

RocketMQ 和 Kafka 怎么选?

面试问 364 约 2 分钟读完

随机一题
本文目录
  1. 面试怎么回答
  2. 设计目标不同
  3. 存储结构的差异
  4. 功能对比
  5. 怎么选

面试怎么回答

Kafka 定位是高吞吐的日志和流数据管道,顺序写、批量发送、零拷贝,和 Flink、Spark 生态结合紧密,适合大数据链路;RocketMQ 定位是业务消息,所有主题顺序写同一个 CommitLog,主题多时性能更稳定,还原生支持事务消息、延时消息、重试和死信。我会让业务系统间的异步解耦用 RocketMQ,数据采集和实时数仓的数据总线用 Kafka,两者可以并存。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

业务系统常用 RocketMQ,大数据链路常用 Kafka。面试官会问:两者设计上有什么不同?各自适合什么场景?

设计目标不同

  • Kafka:面向高吞吐的日志和流数据,强调顺序读写、批量发送、零拷贝,非常适合埋点、日志、CDC 这类海量数据传输,以及和 Flink、Spark 的流计算对接。
  • RocketMQ:面向业务消息,提供了很多业务开发需要的功能:事务消息、延时消息、消息过滤、消息轨迹、失败重试和死信队列等。

存储结构的差异

Kafka 每个分区一组独立的日志文件。分区数很多时,大量文件的随机写会让性能下降。

RocketMQ 把一个 Broker 上所有主题的消息顺序写入同一个 CommitLog,再为每个队列建立轻量的消费索引(ConsumeQueue)。主题和队列很多时,写入依然是顺序的,更适合业务场景中主题多、单主题量不大的情况。

功能对比

  • 事务消息:RocketMQ 支持「半消息 + 本地事务 + 回查」的模式,保证本地事务和发消息的一致性;Kafka 的事务主要用于跨分区原子写和 Exactly-Once 的读处理写。
  • 延时消息:RocketMQ 原生支持,Kafka 需要自己实现。
  • 消费失败重试和死信:RocketMQ 内置,Kafka 需要业务侧处理。

怎么选

  • 大数据采集、日志、实时数仓的数据总线:Kafka。
  • 订单、支付等业务系统之间的异步解耦,需要事务消息、延时消息、重试:RocketMQ。

很多公司两者并存:业务系统用 RocketMQ,数据链路用 Kafka,中间通过同步工具打通。