为什么Kafka性能强于RabbitMQ

一、Kafka VS RabbitMQ   

     检验一款消息队列的核心性能指标是 系统吞吐量 和 系统延迟

  • 吞吐量测试测量队列在硬件(特别是磁盘和 CPU)使用方面的效率。
  • 延迟测试测量每个系统传递实时消息的差别,这是实时任务关键型应用程序以及微服务架构的核心要求。

结论:

吞吐量:Kafka 在三个系统中的吞吐量最高,是 RabbitMQ 的 15 倍,Pulsar 的 2 倍。

系统延迟:Kafka 在较高的吞吐量下提供了最低的延迟,同时还提供了强大的持久性高可用性。RabbitMQ 可以实现比 Kafka 更低的端到端延迟(在吞吐量低很多的情况下)

二、Kafak的高吞吐和低延迟是怎么实现的?

  1. 页缓存技术+磁盘顺序写

       Kafka的消息数据是写在硬盘上的,保证了消息数据的可靠性,但写硬盘还能保证几十万条/秒的消息处理速度,是怎么做到的?答案是基于操作系统的页缓存和磁盘顺序写来实现的。

        页缓存Page Cache—操作系统自己管理的内存缓存(os cache。Kafka在写入消息时是直接写入页缓存,然后由操作系统决定什么时候把页缓存里的数据刷入磁盘文件中。这样一来,消息写入性能就变成了写内存,不是在写磁盘,请看下图。

                                  

         常规的磁盘写入都是随机写,随便找到文件的某个位置来写数据,这样的性能非常差,但是通过追加文件末尾按照顺序的方式来写数据的话,其写入性能跟写内存的性能都相差无几的,Kafak就是采用顺序写的方案。再加上页缓存的应用,才能做到在普通服务器上每秒写入几十万条消息,实现了数据写入的超高性能 。

     2.零拷贝技术

        解决了写入问题,那消息读取呢?频繁的从磁盘读数据然后发给消费者,性能又是如何保证的?Kafka为了解决这个问题,在读数据的时候是引入零拷贝技术。

先看下图是常规的硬盘读写流程,操作系统读取硬盘数据后放在OS Cache,然后需要拷贝一次到Kafka进程,然后Kafka再将数据拷贝到Socket缓存才能发送到网卡,这样流程的性能当然没有保障。

       

 再看下图, Kafka的设计是直接将操作系统OS Cache中的数据发送到网卡,跳过了两次拷贝数据的步骤,Socket缓存中仅仅会拷贝一个文件描述符过去,不会拷贝数据到Socket缓存,大大提升了数据读取性能

### KafkaRabbitMQ 的核心区别 KafkaRabbitMQ 均属于消息中间件,但在设计理念和技术架构上有显著差异。以下是两者的具体对比: #### 1. **设计目标** - Kafka 被设计为一个分布式事件流平台,专注于高吞吐量、低延迟的消息传递和实时数据处理[^3]。它的典型应用场景包括日志收集、监控数据聚合以及大规模的数据管道构建。 - RabbitMQ 则是一个通用的消息代理,支持多种协议(如 AMQP),并提供灵活的路由机制。它更适合于复杂的业务逻辑场景,尤其是需要复杂消息分发模式的应用环境。 #### 2. **消息持久化方式** - Kafka 使用基于磁盘的日志文件存储消息,并通过顺序 I/O 提升性能。这种方式使得 Kafka 即使面对海量数据也能保持较低的成本和较高的效率[^5]。 - RabbitMQ 主要依赖内存缓存来加速消息传递过程,虽然可以配置持久化的选项,但这通常会牺牲一定的速度表现。 #### 3. **消费模型** - 在 Kafka 中采用的是发布/订阅模型,消费者以拉取的方式获取数据;同时允许多个消费者组共存而不互相干扰。 - 对于 RabbitMQ 来说,则提供了更为丰富的消费形式——除了简单的队列外还支持扇形广播(fanout exchange)、直连交换(direct exchange)等多种类型的exchange来进行更加精细的消息投递控制[^4]。 #### 4. **扩展性与容错能力** - Apache Kafka 天然具备良好的水平伸缩特性和内置副本机制,能够轻松应对数千甚至上万级别的分区规模下的负载均衡需求,同时也拥有强大的自动恢复功能,在部分节点失效时仍能维持服务可用状态。 - 相较之下,当涉及到超大型集群部署(超过三十多个节点以上的情况),RabbitMQ 可能面临更多挑战,因为其内部维护着大量元数据信息,随着网络拓扑变得越来越复杂可能会导致管理难度增加。 --- ### 为什么选择 Kafka? 如果项目侧重于以下方面之一或几个特点组合起来考虑的话,那么选用Kafka可能是更好的决定: - **高性能**: 如果应用程序需要速传输巨量的小型记录或者持续不断地流入新产生的资料集(Kafka擅长于此)[^4]. - **可扩展性强**: 当预期未来会有不断增长的工作负荷, 并希望无需停机就能动态调整资源分配给系统的时候 (得益于kafka的设计理念), 它将是理想的选择. - **成本效益好**: 因为其高效利用硬盘而非昂贵RAM作为主要储存媒介的缘故, 运营开支相对较小. - **生态系统完善**: 存在一个活跃社区围绕此开源软件贡献插件工具链等附加价值组件供开发者调用整合到自己的解决方案当中去. ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') for _ in range(100): producer.send('my-topic', b'some_message_bytes') ``` 上述代码片段展示了如何简单地向Kafka topic发送一条消息的例子. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值