Kafka、RabbitMQ、RocketMQ对比

Kafka、RabbitMQ 和 RocketMQ 都是流行的消息中间件系统,每个系统都有其独特的设计哲学和适用场景。尽管它们的基本功能相似,都用于消息的发送和接收,但在架构设计、性能、可靠性、扩展性和使用场景等方面有所不同。以下是它们的详细对比。

1. Kafka 与 RabbitMQ、RocketMQ 的对比概述

特性

Kafka

RabbitMQ

RocketMQ

架构设计

分布式、基于日志的消息系统

基于 AMQP 协议的消息队列,支持多种模式

分布式、支持高吞吐量和低延迟的消息系统

消息存储

长时间存储,持久化到磁盘(支持消息保留策略)

默认持久化,消息存储是队列中的临时数据

支持持久化和高吞吐量的存储方式

消费者模型

支持拉取(pull)模型和消费者组(consumer group)

支持推送(push)模型和消费者模式

支持拉取(pull)模型和消费者组(consumer group)

消息顺序性

支持分区内顺序,跨分区无顺序保证

每个队列内的消息是有序的

支持分区内顺序,但跨分区无顺序保证

消息确认机制

支持消息的自动或手动确认

支持消息确认(ACK)

支持消息确认(ACK)

扩展性

极高的横向扩展性,可以扩展到数千个分区

水平扩展较为困难,性能瓶颈较早出现

高度可扩展,支持分布式架构

协议支持

自定义协议,主要用于流式数据处理

基于 AMQP 协议,支持多种消息传输协议

自定义协议,兼容 Kafka 的协议

使用场景

大规模流式数据处理、日志聚合、事件溯源等

高可靠性、低延迟的小消息系统、请求/响应模式

高吞吐量、分布式事务、金融级消息传递

性能

高吞吐量、低延迟、大数据流处理

较低的吞吐量,适合短小消息

高吞吐量、低延迟,适合大规模分布式场景

延迟

较低,尤其在分布式系统中

一般,依赖于系统负载和网络性能

较低,支持高吞吐量的低延迟处理

2. Kafka vs RabbitMQ vs RocketMQ 详细对比

2.1 架构设计

  • Kafka: Kafka 是一个分布式的日志消息系统,采用了发布-订阅模式,支持大量的消息流,通常用于大规模数据处理、日志收集、流处理等。Kafka 的核心是高效的日志存储,它将所有消息按顺序追加到分区中的日志文件中,可以高效地进行数据写入与读取。
  • RabbitMQ: RabbitMQ 是一个基于 AMQP(高级消息队列协议) 的消息队列系统。它通过支持多种队列和路由模式,提供了丰富的消息传递特性。RabbitMQ 采用传统的队列模型,即生产者将消息放入队列,消费者从队列中消费消息。
  • RocketMQ: RocketMQ 是阿里巴巴开源的分布式消息队列系统,基于分布式日志的架构。它强调高吞吐量和低延迟,特别适用于金融、电商等场景的高并发消息处理。

2.2 消息存储与持久化

  • Kafka: Kafka 使用磁盘持久化消息,它的消息存储机制非常高效。消息会按分区持久化到磁盘,并支持通过配置进行消息保留策略(如按时间或按大小)。这使得 Kafka 能够高效地存储大规模的数据并且不容易丢失消息。
  • RabbitMQ: RabbitMQ 默认会将消息持久化到磁盘,消息的持久化与否是通过队列的配置决定的。它支持较为复杂的持久化和消息确认机制,但对于高吞吐量场景,其性能可能不如 Kafka。
  • RocketMQ: RocketMQ 也支持消息持久化,且采用 分布式存储 方式,具备较高的吞吐量和可扩展性。它的数据存储采用高效的日志存储结构,可以按需清理过期消息。

2.3 消费者模型

  • Kafka: Kafka 提供了消费者组(Consumer Group)的概念,多个消费者可以共同消费一个主题(Topic),每个消费者只消费该主题的一部分分区,保证了负载均衡和扩展性。消费者基于拉取(Pull)模型,从 Kafka 中拉取消息。
  • RabbitMQ: RabbitMQ 采用推送(Push)模型,消费者会从队列中接收消息。它通过队列中的消息分配给消费者,可以选择多种路由方式(如简单队列、主题交换机、直连交换机等)。
  • RocketMQ: RocketMQ 也使用拉取(Pull)模型,它支持消息的顺序消费,并提供了消费者组的功能。RocketMQ 支持分布式事务消息,特别适合高并发的金融级别应用。

2.4 消息顺序与可靠性

  • Kafka: Kafka 保证分区内的消息顺序,但不保证跨分区的顺序性。它的消息确认机制支持自动确认或手动确认,消费者可以通过管理偏移量来控制消费进度。Kafka 通过副本机制保证消息的可靠性。
  • RabbitMQ: RabbitMQ 保证队列内的消息顺序。消息确认机制支持客户端显式确认(ACK)。如果消息没有被确认,则会被重新投递到队列中。它通过持久化机制保证可靠性,但在高负载下可能会出现性能瓶颈。
  • RocketMQ: RocketMQ 支持分区内顺序消费,但不保证跨分区顺序。它的消息确认机制较为灵活,支持多种消息模式,如一次性消息、顺序消息、事务消息等。RocketMQ 使用副本机制保障消息的可靠性。

2.5 扩展性与性能

  • Kafka: Kafka 是非常适合大规模分布式系统的消息队列,具有极高的吞吐量。其水平扩展性非常强,可以通过增加分区数和节点来扩展系统的容量和性能。
  • RabbitMQ: RabbitMQ 水平扩展能力有限,虽然可以通过集群和镜像队列来扩展,但它的扩展性通常不如 Kafka。它的性能在吞吐量要求较高时可能受到限制。
  • RocketMQ: RocketMQ 提供了较高的扩展性,能够处理大规模的消息流。它支持分布式部署,尤其在分布式事务消息和高并发场景下表现优秀。

2.6 使用场景

  • Kafka: Kafka 非常适合高吞吐量、大规模数据流处理、日志收集、事件溯源和实时数据分析等场景。Kafka 是流式数据处理和大数据分析生态中的重要组件。
  • RabbitMQ: RabbitMQ 适用于请求/响应模式、任务队列模式、异步消息处理、轻量级的应用场景。它的设计偏向于支持高可靠性、低延迟的消息传递。
  • RocketMQ: RocketMQ 适用于金融、电商、物流等需要高吞吐量、低延迟、高可靠性的场景,尤其在分布式事务消息和高并发场景下有良好的表现。

3. 核心架构

3.1 Kafka

  • 架构类型: 分布式日志存储,消息通过 主题(Topic) 管理。
  • 数据存储: 主题分为多个 分区(Partition),分区内的消息是有序的。
  • 消费模型: 基于 消费组(Consumer Group),支持广播模式和负载均衡模式。
  • 高吞吐: 使用磁盘顺序写和零拷贝优化数据写入性能。
  • 数据保留: 支持基于时间或存储大小的日志清理策略(删除或压缩)。

3.2 RabbitMQ

  • 架构类型: 基于 AMQP 协议的消息代理,使用 交换机(Exchange)队列(Queue)
  • 路由机制: 消息通过交换机路由到一个或多个队列(支持 Direct、Fanout、Topic、Headers 模式)。
  • 消费模型: 支持点对点和发布订阅模式。
  • 易用性: 具备丰富的管理界面和工具,支持多种协议(AMQP、MQTT、STOMP)。

3.3 RocketMQ

  • 架构类型: 分布式消息队列,设计与 Kafka 类似,支持日志和队列模式。
  • 数据存储: 消息以 主题(Topic) 的形式组织,并分为多个 队列(Queue)
  • 消费模型: 支持广播模式和负载均衡模式。
  • 事务支持: 提供强大的事务消息能力。
  • 大数据集成: 深度集成 Hadoop 和 Spark 等生态系统。

4. 选择建议

需求 / 特点

推荐系统

高吞吐量,适配大数据场景

Kafka

复杂路由,低延迟场景

RabbitMQ

事务消息,延迟消息

RocketMQ

实时数据流处理

Kafka

企业级消息传递

RabbitMQ

分布式事务、高可靠性

RocketMQ

详细参考:https://blog.csdn.net/2401_83413238/article/details/145216028?spm=1001.2014.3001.5502

Kafka碎碎念 文章被收录于专栏

Kafka的一些碎碎念,哈哈哈哈哈

全部评论
m
点赞 回复 分享
发布于 2025-02-01 16:10 重庆
世另我
点赞 回复 分享
发布于 2025-01-15 19:49 山东
学到了
点赞 回复 分享
发布于 2025-01-13 10:20 香港
m
点赞 回复 分享
发布于 2025-01-13 02:23 辽宁

相关推荐

04-17 11:13
已编辑
厦门大学 Java
还在等hr面结果,发面经,攒攒人品~4.2一面(隔天出结果)主要是八股,问得相对比较基础。八股1、Redis里常用的数据结构有哪些?介绍一下每个数据结构的底层数据结构。2、解释一下跳表是什么?3、Redis常用的淘汰策略有哪些?如果让你实现Redis里面的最少使用淘汰策略(LRU)和基于频率的的淘汰策略有哪些?4、使用缓存的时候要注意避免哪些极端情况?缓存三兄弟说一下。5、简单说一下进程。6、有用过协程吗?7、一个进程在执行fork操作的时候,子进程会继承父进程的什么信息?8、用户态和内核态之间转换的时候发生了什么?9、操作系统的内存管理和内存分配你了解哪些?10、为什么TCP是三次握手?项目1、你项目的Redis分布式锁是怎么实现的?执行什么命令?2、那你这套机制怎么避免死锁问题呢?3、怎么确保这个锁没有被其他的线程抢到?有过期时间吗?4、怎么确保这个锁没有被其他的线程抢到?有过期时间吗?过期时间一定能保证任务已经执行完了吗?5、那如果说你(持有锁的线程)先挂了会怎么样?6、你刚才不是说会对状态机进行回滚?还是说你是对这个后续拿到锁的线程直接退出还是回滚?手撕单向链表删除倒数第N个节点4.9二面(当天出结果)二面感觉是最难的,上来就直接开始拷打消息中间件的细节了。八股和项目结合着问的。最后还问了点场景题。1、能大概解释一下 RocketMQ 的一些机制吗?2、一条消息在 RocketMQ 中的完整消费流程是怎样的?3、生产者是怎么将消息发送到 Broker 的?4、消费者订阅后,消息是拉取还是推送的?5、为什么 RocketMQ 的吞吐量比 RabbitMQ 更高?6、如何保证消息不丢失?7、RocketMQ 中如何保证消息的顺序性?8、了解 Broker 的主从架构吗?10、你项目中消息中间件主要解决了什么问题?11、能简单介绍 Redis 的特性吗?12、Redis为什么这么快?13、如何解决缓存击穿问题?14、如果大量 key 同时过期,该怎么办?15、Redis 的内存淘汰策略有哪些?16、内存淘汰的触发机制是什么?17、了解 Redis 的主从和哨兵架构吗?18、哨兵是如何选举主节点的?19、如果所有从节点都健康,只有主节点挂了,哨兵如何选出新主?20、简单介绍一下你对微服务架构的理解。21、如果微服务中一个核心模块宕机了,有什么缓解方式?22、如果某个特定请求因代码缺陷导致所有实例依次宕机,如何避免这种情况?23、除了限流,常态下如何避免一个用户打挂所有实例?手撕:从数组中找出所有和为target的子集4.13三面(当天出结果)三面基本上都是问实习相关的问题,还问了一点跟项目相关的问题。1、介绍一下你认为最值得说的一个项目。2、介绍一下你的MinIO的纠删码机制。3、MinIO的集群是怎么做的扩容?4、你项目的各个量化指标介绍一下,并且说明是怎么测量以及怎么提升的。手撕:带过期时间的LRU(手动实现双向队列)4.14hr面(等待结果中)主要是了解了一下在实习过程中遇到的问题和解决方法,也问了一下自己对新岗位的期待和一些场景的处理方式。还问了一下到岗时间。总结:四次面试的面试官都很耐心,而且全程都是积极回应我的回答,反问也都很耐心的解答我的问题。希望能够顺利OC4.15更新 已口头offer4.17更新 已offer
点赞 评论 收藏
分享
04-13 22:27
门头沟学院 Java
一、 实习相关二、 MySQL 数据库原理5. 除了 LIKE 这种模糊查询,还有什么情况会导致 MySQL 索引失效?6. MySQL 的索引有哪些类型?7. 要查看一个 SQL 的执行性能应该怎么看?8. MySQL 的表数据量达到什么量级之后性能可能会急剧下降?为什么?9. SQL 里面的 UNION 和 UNION ALL 有什么区别?三、 个人项目与 Redis 核心原理10. 你的项目里面用 Redis 做了什么?11. 为什么用 Redis 做缓存?(为什么 Redis 执行得这么快?)12. 为什么 Redis 单线程能有那么高的并发量?除了主线程,Redis 还有其他子线程吗?13. Redis 单机的 QPS 一般能达到多少?14. 简单介绍一下 Redis 的 IO 多路复用是一个什么样的机制?15. Redis 里面常见的基础数据结构和高级数据结构有哪些?16. 为什么要用 Lua 脚本?17. Redis 里的 TTL 是个什么概念?四、 分布式架构基础18. 分布式的概念是什么?为什么在分布式场景下单机的 JVM 锁解决不了一人一单的问题?19. 微服务架构和分布式架构有什么不一样?20. 单体架构和分布式架构各自有什么优劣?五、 Java 基础与 JVM 原理21. 什么是 Java 的双亲委派机制?22. 为什么要用双亲委派机制?(如果不使用会导致什么样的安全问题?)23. 你了解哪些垃圾回收算法?24. JVM 里面年轻代和老年代一般的垃圾回收机制是怎样的?(分代回收思想)25. 怎么识别哪些对象是需要回收的垃圾?26. 列举几个常见的 GC Roots。六、 并发编程 (JUC)27. 线程池常用的几个核心参数是什么?28. 核心线程数和最大线程数在任务执行机制上有什么区别?(请描述任务提交到线程池后的流转过程)七、 线上排查与网络协议29. 如果某天发现线上的服务突然卡死了,大概有什么样的分析和排查方式?30. 如果让你人为制造一个 OOM(内存溢出),你要怎么去写代码?31. Java 里面的 Error 和 Exception 有什么区别?32. 如果有用户反馈网站很慢,大概的一个排查和分析路径是怎样的?33. 从在浏览器中输入 URL 打开网页到返回结果,中间经历了哪些步骤?八、 算法手写题34. 两个有序数组的中位数。
查看30道真题和解析
点赞 评论 收藏
分享
评论
13
63
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务