RabbitMQ、Kafka和RocketMQ比较

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

一、概述

消息队列中间件(MQ)是不同系统之间消息传递,异步通信的常见组件,RabbitMQ、Kafka和RocketMQ是目前业界常见的3种消息中间件,本文重点阐述了他们特性差异、架构设计和处理常见问题的方案。

二、特性比较

RabbitMQ适合于中小规模的使用场景,是目前业界使用最广泛的一种MQ,其完全实现了AMQP的协议,实现了非常丰富的消息可靠性的保障机制,和其他MQ相比,其在可靠性方面是最强的,但也正是由于可靠性方面实现机制过于沉重,导致其吞吐量并不高,在生产环境经常会出现消息积压的问题。

Kafka适合于实时流处理的使用场景,在大数据处理领域经常见到,可以用来处理海量的日志数据和IoT海量数据采集,由于其基于文件顺序读写的存储架构和基于zero-copy的IO处理策略,使得他的吞吐量非常之高,性能非常之好,能够达到百万级别的数据处理吞吐量,其可靠性保障主要是基于多副本这种策略,所以可靠性方面明显不如RabbitMQ。

RabbitMQ Kafka RocketMQ
使用场景 中小规模的使用场景 实时流处理、海量日志数据处理 性能均衡,优势在分布式事务场景
可靠性 高,AMPQ协议保障 低,基于多副本机制保障 中等,基于事务的保障
吞吐量 低,万级别 高,基于顺序读写的存储架构,百万级别 中等,十万级别
时效性 毫秒级别 毫秒级别 毫秒级别
优点 可靠性非常高 吞吐量非常大,性能非常好,集群高可用 性能和功能全面,擅长分布式事务方向
缺点 吞吐量比较低,消息积累会影响性能,基于erlang开发不好定制 数据可靠性保障较低,会存在数据丢失 客户端只支持Java,官方文档支持较少

三、常见问题处理策略

1.可靠性保障

  • RabbitMQ
  1. 持久化机制。RabbitMQ通过消息持久化机制来确保消息的可靠传递。生产者可以选择将消息标记为持久化,使得即使在消息队列服务器故障后,消息也能被保存并传递给消费者。
  2. RabbitMQ生产者提供的可靠性机制包括发布确认(Publish Confirm)、事务机制(Transaction),生产者可以通过发布确认和事务机制获取消息是否成功被RabbitMQ接收和处理的确认;RabbitMQ生产者提供的可靠性保障机制包括消息确认机制(ACK),消费者可以通过消息确认机制来保障消息的可靠消费。
void basicAck(long deliveryTag, boolean multiple)//确认消息
void basicNack(long deliveryTag, boolean multiple, boolean requeue)//拒绝消息
void basicRecover(boolean requeue)//重发消息
  • Kafka
  1. 持久化。kafka的消息在发送前会被持久化存储到磁盘上,即使在服务器重启后也不会丢失。但也需要对kafka的持久化消息设置失效时间,保障存储空间的充足。
  2. 多副本。Kafka采用多副本机制,将消息复制到多个Broker节点上,即使其中一个Broker节点故障,仍然可以从其他副本节点读取和传递消息。
  • RocketMQ

    和kafka类似。

总结:RabbitMQ相比Kafka和RocketMQ,他有跟丰富的可靠性保障机制,包括保障生产者消息的可靠发送、数据的持久化还有消费者的可靠消费。

2.流控措施

流控措施主要是为了解决消息积压的问题,如果生产者生成消息速率过快,而消费者消费消息的速率过慢,则会在MQ中形成消息挤压,如果不及时处理就会造成MQ服务不可用或者OOM等问题。

  • RabbitMQ
  1. 调整消费者消息消费速率。主要是用来控制消费任务的条数。可以使用QoS(Quality of Service)机制设置每个消费者的预取计数,限制每次从队列中获取的消息数量,以控制消费者的处理速度。
  2. 调整消费者消息消费流量。主要是用来控制消费消息的大小。通过设置basic.qos或basic.consume命令的参数来控制消费者的处理速度,避免消息过多导致积压。
/**
* prefetchSize:服务器传送最大内容量(以八位字节计算),如果没有限制,则为0
* prefetchCount:服务器每次传递的最大消息数,如果没有限制,则为0;
* global:如果为true,则当前设置将会应用于整个Channel(频道)
**/
void basicQos(int prefetchSize, int prefetchCount, boolean global)
  • Kafka
  1. 调整分区数和副本数。kafka下游消费者的数量和其分区数是一致的,所以Kafka通过分区和副本机制来实现消息的并行处理和负载均衡。可以根据消息的负载情况和消费者的处理能力,通过增加分区数量、调整副本分配策略等方式来提高系统的处理能力。
  2. 调整消息失效策略。kafka提供了消息的保存策略和清理策略,可以根据时间和数据的使用情况来设置。
  • RocketMQ
  1. 动态调整消费者数量。RabbitMQ可以根据系统的负载情况和消息队列的堆积情况,动态调整消费者的并发消费线程数,以适应消息的处理需求。
  2. 调整数据的拉取或推送的模式。RocketMQ还提供了消息拉取和推拉模式,消费者可以根据自身的处理能力主动拉取消息,避免消息积压过多。

总结:流控措施的几种方式主要包括:(1)扩大下游消费者的消费速率和流量;(2)增大消费者的数量,扩大消费能力;(3)调整MQ的副本或分区数,发挥下游消费者的最大消费能力;(4)拉取或推送模式的权衡。

3.重复消费问题

重复性消费问题主要需要解决是幂等性问题,对于重复下发的消息也能保障唯一性消费。

  • RabbitMQ
  1. 幂等性处理。在消费者端实现幂等性逻辑,即无论消息被消费多少次,最终的结果应该保持一致。这可以通过在消费端进行唯一标识的检查或者记录已经处理过的消息来实现。没下消费任务时都去查询该任务是否已被消费,这种是重复下发后处理的方式。
  2. 消息确认机制。消费者在处理完消息后,发送确认消息(ACK)给RabbitMQ,告知消息已经成功处理。RabbitMQ根据接收到的确认消息来判断是否需要重新投递消息给其他消费者,这种是主动通知消息下发的方式。
  • Kafka
  1. 消息确认机制。消费者在处理完消息后,提交已消费的偏移量(Offset)给Kafka,Kafka会记录已提交的偏移量,以便在消费者重新启动时从正确的位置继续消费。消费者可以定期提交偏移量,确保消息只被消费一次。
  • RocketMQ
  1. 使用消息唯一标识符(Message ID)。在消息发送时,为每条消息附加一个唯一标识符。消费者在处理消息时,可以通过判断消息唯一标识符来避免重复消费。可以将消息ID记录在数据库或缓存中,用于去重检查。

总结:在MQ中处理重复消费的问题主要的思路有:(1)通过给消息加唯一性标识来过滤已经消费的消息,对于像RocketMQ这种存在Messeage ID的,处理起来就比较简单,就只需要对Messeage ID去重即可,对于像RabbitMQ和kafka这种可以将消息状态保存在数据库或缓存中进行唯一性去重;(2)消息确认机制,就是对于消息的消费会主动上报的,每次消费完就会进行确认,在RabbitMQ中是会恢复ACK标识,在kafka中是会恢复offset标识。

4.消息顺序性

  • RabbitMQ
  1. 单个队列。rabbitmq 保证了同一个队列中的消息按照发布的顺序进入和出队。
  • Kafka
  1. 有序分区。kafka 保证了同一个分区(topic + partition)中的消息按照发布的顺序存储和消费。
  • RocketMQ
  1. 有序分区。rokcetmq 保证了同一个队列(topic + queueId)中的消息按照发布的顺序存储和消费。

参考资料

  1. MQ黄金三剑客:RabbitMQ、RocketMQ和Kafka深入解密常见问题及功能对比指南?:https://juejin.cn/post/7254267283249840184?utm_source=gold_browser_extension
  2. 【RabbitMQ.Client笔记】Qos与消息应答:https://www.cnblogs.com/fanfan-90/p/13589626.html (说明了通过Qos做限流,通过手动ACK来进行消息确认)
  3. 《RabbitMQ系列》之RabbitMQ的优先级队列:https://zhuanlan.zhihu.com/p/582787804(实现了优先级队列)

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-719952.html

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

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

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

相关文章

  • Kafka、RabbitMQ、RocketMQ中间件的对比

    消息中间件现在有不少,网上很多文章都对其做过对比,在这我对其做进一步总结与整理。     RocketMQ 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,201

    2024年02月05日
    浏览(39)
  • 消息中间件,RabbitMQ,kafka常见面试题

    RabbitMQ和Kafka都是消息队列系统,可以用于流处理。流处理是指对高速、连续、增量的数据进行实时处理。 RabbitMQ 和 Kafka 的相同点有以下几个: 都是消息队列系统,可以用于流处理、异步通信、解耦等场景 都是开源的,有活跃的社区和丰富的文档 都支持分布式部署,具有高

    2024年02月04日
    浏览(40)
  • 基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

    场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个生产一个消费,那么在实例化对象的时候根据配置文件指定当前项目使用的那个消息队列中

    2024年02月14日
    浏览(64)
  • 实战:Spring Cloud Stream集成兼容多消息中间件kafka、rabbitmq

    前面的博文我们介绍并实战演示了Spring Cloud Stream整合rabbitmq,其中主要介绍了如何使用和配置完成消息中间件的集成。但是,在实际的生产环境中可能会用到多个消息中间件,又或者是由于业务改变需要更换消息中间件,在这些情况下我们的Spring Cloud Stream框架可以完全兼容多

    2024年02月08日
    浏览(54)
  • 想学高并发技能,这些常用的消息中间件( RabbitMQ、Kafka、ActiveMQ、Redis、NATS )你要必知

    对于全栈或者后端工程师来说,解决高并发是一个必备的技能,一说到高并发时,我们第一反应是分布式系统,那么,消息中间件( RabbitMQ 、 Kafka 、 ActiveMQ 、 Redis 、 NATS 等)的出现是为了解决分布式系统中的消息传递和异步通信的问题,以及提供可靠的消息传递机制。它们

    2024年04月15日
    浏览(56)
  • RocketMQ(消息中间件)

    目录 一、为什么会出现消息中间件? 二、消息中间件是干嘛的? 三、应用解耦 四、流量削峰 五、异步处理 1.串行方式: 2.并行方式: 3.引入消息队列:  六、RocketMQ的架构及概念 Http请求默认采用同步请求方式,基于请求与响应模式,在客户端与服务器进行通讯 时,客户端

    2024年02月10日
    浏览(49)
  • 消息中间件-RocketMQ

            RocketMQ是阿里巴巴开源的消息分布中间件,在阿里内部使用非常更广泛,已经经过了“双11”这种万亿级的应用场景考验。 1.安装         下载地址:http://rocketmq.apache.org/release_notes/release-notes-4.4.0/         下载完成后解压缩安装包到指定目录。 2.配置    

    2024年02月09日
    浏览(45)
  • 消息中间件系列 - RocketMQ

    本内容仅用于个人学习笔记,如有侵扰,联系删除 【尚硅谷】RocketMQ教程丨深度掌握MQ消息中间件_哔哩哔哩_bilibili 1 、MQ简介 MQ , Message Queue ,是一种提供 消息队列服务 的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据。

    2024年02月16日
    浏览(73)
  • 消息队列中间件 MetaQ/RocketMQ

    推荐电子书:云原生架构白皮书 2022版-藏经阁-阿里云开发者社区 (aliyun.com) 简介—— 消息队列中间件 MetaQ/RocketMQ 中间件 MetaQ 是一种基于队列模型的消息中间件,MetaQ 据说最早是受 Kafka 的影响开发的,第一版的名字 \\\"metamorphosis\\\",是奥地利作家卡夫卡的名作——《变形记》。

    2024年02月14日
    浏览(57)
  • 消息中间件之RocketMQ源码分析(十)

    启动命令 nohup ./bin/mqnamesrv -c ./conf/namesrv.conf dev/null 21 通过脚本配置启动基本参数,比如配置文件路径、JVM参数,调用NamesrvStartup.main()方法,解析命令行的参数,将处理好的参数转化为Java实例,传递给NamesrvController实例 加载命令行传递的配置参数,调用controller.initialize()方法初

    2024年02月20日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包