RocketMq和Kafka对比

这篇具有很好参考价值的文章主要介绍了RocketMq和Kafka对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RocketMq和Kafka对比

kafka高性能原因:

生产者:

Kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术,顺序写入和MMFile

顺序写入:

因为硬盘是机械结构,每次读写都会寻址->写入,其中寻址是一个“机械动作”,它是最耗时的。所以硬盘最“讨厌”随机I/O,最喜欢顺序I/O

为了提高读写硬盘的速度,Kafka就是使用顺序I/O。收到消息后Kafka会把数据插入到文件末尾。这种方法有一个缺陷——没有办法删除数据,所以Kafka是不会删除数据的,它会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示读取到了第几条数据

Memory Mapped Files:

Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/O效率

Memory Mapped Files也被翻译成内存映射文件,在64位操作系统中一般可以表示20G的数据文件,它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。完成映射之后你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。这种方法也有一个很明显的缺陷——不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。

Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)

消费者:

zero copy:

传统read/write方式进行网络文件传输的方式,文件数据实际上是经过了四次copy操作:硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎kafka基于sendfile实现Zero Copy,直接从内核空间(DMA的)到内核空间(Socket的),然后发送网卡。

批量压缩:

在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO。进行数据压缩会消耗少量的CPU资源,不过对于kafka而言,网络IO更应该需要考虑。Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩。Kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩。Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议。

rocketMq高性能原因:

生产者:

顺序写入:

消息存储是由ConsumeQueue和CommitLog配合完成的一个Topic里面有多个MessageQueue,每个MessageQueue对应一个ConsumeQueue。ConsumeQueue里记录着消息物理存储地址。CommitLog就存储文件具体的字节信息。文件大小默认1g,文件名称20位数,左边补0右边为偏移量。消息顺序写入文件,文件满了则写入下一个文件

消费者

随机读

每次读消息时先读逻辑队列consumQue中的元数据,再从commitlog中找到消息体。但是入口处rocketmq采用package机制,可以批量地从磁盘读取,作为cache存到内存中,加速后续的读取速度。

随机读具体流程:
  • Consumer每20s重新做一次负载均衡更新,根据从Broker存储的ConsumerGroup和Topic信息,把MessageQueue分发给不同的Consumer,负载策略默认是分页
  • 每个MessageQueue对应一个pullRequest,全部存储到该Consumer的pullRequestQueue队列里面
  • Consumer启动独立后台PullMessageService线程,不停的尝试从pullRequestQueue.take()获取PullRequest
  • 捞取到PullRequest会先做缓存校验(默认一个Queue里面缓存待处理消息个数不超过1000个,消息大小不超过100M,否则会延迟50ms再重试),从而保证客户端的缓存负载不会过高
  • PullRequest发送给Broker,如果Broker发现该Queue有待处理的消息,就会直接返回给Consumer,Consumer接收响应以后,重新把该PullRequest丢到自己的pullRequestQueue队列里面,从而重复执行捞取消息的动作,保证消息的及时性
  • PullRequest发送给Broker,如果Broker发现该Queue没有待处理的消息,则会Hold住这个请求,暂不响应给Consumer,默认长轮询是5s重试获取一次待处理消息,如果有新的待处理消息则立刻Response给Consumer,当客户端检测到消息挂起超时(客户端有默认参数 响应超时时间 20s),会重新发起PullRequest给Broker

消费模型:

常见消费模型有以下几种:
push:producer发送消息后,broker马上把消息投递给consumer。这种方式好在实时性比较高,但是会增加broker的负载;而且消费端能力不同,如果push推送过快,消费端会出现很多问题。
pull:producer发送消息后,broker什么也不做,等着consumer自己来读取。它的优点在于主动权在消费者端,可控性好;但是间隔时间不好设置,间隔太短浪费资源,间隔太长又会消费不及时。
长轮询:当consumer过来请求时,broker会保持当前连接一段时间 默认15s,如果这段时间内有消息到达,则立刻返回给consumer;15s没消息的话则返回空然后重新请求。这种方式的缺点就是服务端要保存consumer状态,客户端过多会一直占用资源。

RocketMQ默认是采用pushConsumer方式消费的,从概念上来说是推送给消费者,它的本质是pull+长轮询这样既通过长轮询达到了push的实时性,又有了pull的可控性。系统收到消息后会自动处理消息和offset(消息偏移量),如果期间有新的consumer加入会自动做负载均衡(集群模式下offset存在broker中; 广播模式下offset存在consumer里)。当然我们也可以设置为pullConsumer模式,这样灵活性会提高,但是代码却会很复杂,需要手动维护offset,消息存储和状态。

zero copy:

零拷贝技术有mmap及sendfile,sendfile大文件传输快,mmap小文件传输快。MMQ发送的消息通常都很小,rocketmq就是以mmap+write方式实现的。

为什么kafka比RocketMQ吞吐量更高?

kafka性吞吐量更高主要是由于Producer端将多个小消息合并,批量发向Broker。kafka采用异步发送的机制,当发送一条消息时,消息并没有发送到broker而是缓存起来,然后直接向业务返回成功,当缓存的消息达到一定数量时再批量发送。此时减少了网络io,从而提高了消息发送的性能,但是如果消息发送者宕机,会导致消息丢失,业务出错,所以理论上kafka利用此机制提高了io性能却降低了可靠性

RocketMQ为何无法使用同样的方式?

RocketMQ通常使用的Java语言,缓存过多消息会导致频繁GC

Producer调用发送消息接口,消息未发送到Broker,向业务返回成功,此时Producer宕机,会导致消息丢失,业务出错。Producer通常为分布式系统,且每台机器都是多线程发送,我们认为线上的系统单个Producer每秒产生的数据量有限,不可能上万。缓存的功能完全可以由上层业务完成。

为什么选择RocketMQ?

当broker里面的topic的partition数量过多时,kafka的性能却不如rocketMq。kafka和rocketMq都使用文件存储,但是kafka是一个分区一个文件,当topic过多,分区的总量也会增加,kafka中存在过多的文件,当对消息刷盘时,就会出现文件竞争磁盘,出现性能的下降一个partition(分区)一个文件,顺序读写。一个分区只能被一个消费组中的一个 消费线程进行消费,因此可以同时消费的消费端也比较少rocketMq所有的队列都存储在一个文件中,每个队列的存储的消息量也比较小,因此topic的增加对rocketMq的性能的影响较小。rocketMq可以存在的topic比较多,可以适应比较复杂的业务

参考并感谢:
https://www.zhihu.com/search?type=content&q=kafka%E4%B8%8ErocketMq%E7%9A%84%E5%8C%BA%E5%88%AB文章来源地址https://www.toymoban.com/news/detail-478029.html

到了这里,关于RocketMq和Kafka对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【消息队列】Kafka如何实现高性能IO

    我们直到Kafka是一个自称高性能的消息队列引擎,一般来说对于中间件的设计需要从计算、存储、网络三方面进行下手,而消息从产生到消费,也会经历多个流程,比如在生产者端采用异步同步方式发送,采用高效的压缩算法,高效的序列化方式,以及网络IO等。那么Kafka主要

    2023年04月13日
    浏览(45)
  • kafka高吞吐、低延时、高性能的实现原理

    作者:源码时代-Raymon老师 Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万,这其中的

    2024年02月04日
    浏览(53)
  • Kafka 最佳实践:构建可靠、高性能的分布式消息系统

    Apache Kafka 是一个强大的分布式消息系统,被广泛应用于实时数据流处理和事件驱动架构。为了充分发挥 Kafka 的优势,需要遵循一些最佳实践,确保系统在高负载下稳定运行,数据可靠传递。本文将深入探讨 Kafka 的一些最佳实践,并提供丰富的示例代码,帮助读者更好地应用

    2024年02月03日
    浏览(55)
  • 【RocketMq系列-02】RocketMq的架构解析和高性能设计

    RocketMq系列整体栏目 内容 链接地址 【一】RocketMq安装和基本概念 https://zhenghuisheng.blog.csdn.net/article/details/134486709 【二】RocketMq的架构解析和高性能设计/font https://zhenghuisheng.blog.csdn.net/article/details/134559514 在rocketMq中,其整体架构如下,在RocketMqServer中,主要有NameServer,Broker,

    2024年02月05日
    浏览(48)
  • 解析RocketMQ:高性能分布式消息队列的原理与应用

    什么是消息队列 消息队列是一种消息传递机制,用于在应用程序和系统之间传递消息,实现解耦和异步通信。它通过将消息发送到一个中间代理(消息队列),然后由消费者从该队列中获取消息并处理。 RocketMQ简介 RocketMQ是阿里巴巴开源的一款高性能分布式消息队列系统。它

    2024年02月14日
    浏览(50)
  • [RocketMQ] Broker asyncPutMessage处理消息以及存储的高性能设计措施 (十一)

    asyncPutMessage方法真正的用来存储消息。 1.asyncPutMessage存储普通消息 DefaultMessageStore#asyncPutMessage() checkStoreStatus, checkMessage, checkLmqMessage校验。 CommitLog#asyncPutMessage存储消息, 更新耗时时间和失败次数。 1.1 checkStoreStatus检查存储状态 如果DefaultMessageStore是shutdown状态, 返回SERVICE_NOT_

    2024年02月13日
    浏览(47)
  • RocketMQ on openEuler 提供高性能消息队列的稳定性解决方案

    RocketMQ on openEuler,是一种将 RocketMQ 消息中间件通过容器化的方式部署在 openEuler 操作系统上运行,借助 openEuler 系统对于 OS 缓存回收效率增强的内核特性,提升消息中间件在面向超大规模高并发、高吞吐量、低延迟场景下稳定性和可靠性的软件解决方案。 移动云 RocketMQ 消息

    2024年02月11日
    浏览(50)
  • RocketMq和Kafka对比

    生产者: Kafka会把收到的消息都 写入到硬盘中,它绝对不会丢失数据 。为了优化写入速度Kafak采用了两个技术, 顺序写入和MMFile 。 顺序写入: 因为硬盘是机械结构,每次读写都会寻址-写入,其中寻址是一个“机械动作”,它是最耗时的。所以 硬盘最“讨厌”随机I/O,最喜

    2024年02月08日
    浏览(38)
  • kafka和rocketmq区别对比

    Kafka和RocketMQ是目前非常流行的分布式消息系统,它们都能够高效地处理海量的消息数据。在本文中,我们将对Kafka和RocketMQ进行技术比较,分析它们在各方面的优缺点,以便读者在选择消息系统时能够做出更加明智的决策。 一、架构设计 Kafka和RocketMQ都是基于发布/订阅模式的

    2024年02月12日
    浏览(41)
  • RocketMQ与Kafka架构深度对比

    在分布式系统中,消息中间件扮演着至关重要的角色,它们负责在系统组件之间传递消息,实现解耦、异步通信和流量削峰等功能。RocketMQ与Kafka作为两款流行的消息中间件,各自拥有独特的架构设计和功能特性。本文将深入对比分析RocketMQ与Kafka在架构设计、组件构成、数据

    2024年02月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包