我的编程空间,编程开发者的网络收藏夹
学习永远不晚

kafka rabbitMQ及rocketMQ队列的消息可靠性保证分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

kafka rabbitMQ及rocketMQ队列的消息可靠性保证分析

1.消息丢失

1.生产者发送失败

所有消息队列都可能发生的问题

  • 生产者发送消息后,队列未成功接收(网络原因或其他)而生产者不知情,消息丢失
  • 生产者发送消息后,队列接收成功->生产者确认,但消息并未持久化,队列崩溃,消息丢失

针对这类问题,三种消息队列都提供了生产者消息发送确认的模式,例如将kafka的acks参数设置为大于0,将rabbitMQ的信道设置为confirm模式。而在rocketMQ中会返回消息发送状态码。其中rabbitMQ和rocketMQ还提供了生产者事务操作。

只有某些消息队列才会发生的问题

  • kafka和rabbitMQ在集群状态下当前首领不可用时会进行首领选举。在kafka中,如果把acks设置为1(只要首领节点收到生产者发送的消息即确认发送成功)时,若当前首领收到的消息但还未同步至从任一节点就崩溃了,kafka会在还来不及判定的非同步从节点中选举出首领,这时消息丢失,解决方式是将acks设置未all,即全部从节点同步成功再确认。而在rabbitMQ中,新加入的镜像节点不会同步在此之前的消息,当老的消息还未完全消费完,老节点全部崩溃时,新节点被选举为首领时,会丢失所有未消费的旧消息(目前好像没有什么好的解决方式)。
  • kafka中,即使及时的将所有未同步消息的节点成功判定未非同步节点,也要在消息丢失和系统不可用之间做出权衡,如果不希望消息丢失,则在首领节点恢复前整个系统不可用,通过参数unclean.leader.election.enable可以设置非同步副本是否能成为首领节点。

  • rocketMQ集群环境下,broker主从使用异步复制模式时,若master节点崩溃且数据无法恢复,会丢失还未同步至从节点的部分消息,解决方式是使用同步双写的方式同步消息,但会降低吞吐率。

2.消费者消费失败

与生产者类似,若消费者在消费消息失败时未告知消息队列,此消息丢失。kafka,rabbitMQ,rocketMQ都提供了相似的消费成功确认机制来解决这个问题,rabbitMQ通过auto_ack参数设置自动确认或手动确认。

而rocketMQ和kafka通过消息偏移量来控制信息消费,rocketMQ在pull模式下需要自己维护偏移量。

3.队列因为自身体原因丢失数据

这个很好理解,例如rabbitMQ默认将消息保存再内存中,如果队列崩溃,消息自然丢失

2.消息顺序

1.kafka

kafka保证同一分区内消息的顺序,也就是说,如果要让某一topic内消息全部有序,只能为该topic设置一个分区,这会降低该主题的吞吐量。通常使用消息的key值将消息散布到不同分区上,以此保证消息的局部有序性,但这种局部有序性的保证仅仅在消息写入分区时是有序的才能保证,例如生产者按顺序消息写入消息A,消息B,消息A写入失败,消息B写入成功,生产者重发消息A且成功,这时候两个消息的顺序就颠倒了,解决方式是设定max.in.flight.requests.per.connection为1,指定生产者在收到消息成功发送的确认之前不允许发送其他信息,但这种方式也会严重降低吞吐量。

另一个问题是kafka默认的分区器使用散列算法将消息的key值映射到对映的分区上,如果增加了分区,key值映射的分区可能会与之前的不一致。在kafka中,一个分区只能被一个消费者消费,保证了消息消费的局部有序性。

2.rocketMQ

rocketMQ的队列(Message Queue)与kafka的分区在概念上相似,所以rocketMQ在消息有序性的保证上自然也是基于队列(Message Queue)的,同kafka一样,如果要让某一主题内的消息有序,必须将此主题内的独写队列数量设为1,但和kafka一样,这种操作会大量降低该主题的吞吐量。

rocketMQ中在发送消息时传入自定义的MessageQueueSelector保证消息生产的局部有序性,在消费消息时push模式下通过MessageListenerOrderly保证顺序消费。

3.rabbitMQ

对于rabbitMQ,我没有找到相关的资料,个人猜测,rabbitMQ同一队列内消息的有序性应该是有保障的,但大多数人会在生产者和消费者中增加消息有序性判断

3.消息重复

几乎所有的消息队列中都未能提供不重复消息的保证,而且消息重复与消息丢失几乎是二选一的问题,大多数情况下我们选择保证消息不丢失而容忍一部分消息重复,最广泛的解决消息重复的方式是在消费者端对消息进行验证或者保证消费的幂等性

以上就是kafka rabbitMQ及rocketMQ队列的消息可靠性保证分析的详细内容,更多关于kafka rabbitMQ rocketMQ消息队列的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

kafka rabbitMQ及rocketMQ队列的消息可靠性保证分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

RabbitMQ和Kafka怎么保证消息队列的可靠性传输

本篇内容主要讲解“RabbitMQ和Kafka怎么保证消息队列的可靠性传输”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RabbitMQ和Kafka怎么保证消息队列的可靠性传输”吧!面试题如何保
2023-06-02

RocketMQ事务消息保证消息的可靠性和一致性

RocketMQ事务消息是一种能够保证消息传递的可靠性和一致性的消息传递模式。它通过引入“半消息”和“事务状态”机制,实现了消息发送和本地事务执行的原子性,从而确保了消息的可靠性和一致性
2023-05-17

Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧

在Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧包括以下几个方面:1. 使用消息确认机制:在RabbitMQ中,可以使用基本确认机制来确保消费者已经成功接收并处理了消息。在消费者端,可以使用channel.Qos方法设置为
2023-10-20

Golang中使用RabbitMQ实现消息确认和保证可靠性的最佳实践

在Golang中使用RabbitMQ实现消息确认和保证可靠性的最佳实践包括以下步骤:1. 引入依赖包:使用`go get`命令安装RabbitMQ的Golang客户端库`github.com/streadway/amqp`。2. 建立与Ra
2023-10-08

Java JMS最佳实践:保证消息队列系统稳定可靠运行的秘诀

Java JMS最佳实践旨在帮助您构建稳定、可靠的消息队列系统。本文将讨论如何选择合适的JMS提供程序,如何设计和构建消息队列,以及如何监控和管理消息队列系统。
Java JMS最佳实践:保证消息队列系统稳定可靠运行的秘诀
2024-02-26

Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧和最佳实践

在Golang中使用RabbitMQ实现消息确认和保证可靠性的技巧和最佳实践如下:1. 使用事务:在Golang中,RabbitMQ的AMQP客户端支持事务。你可以在发送消息之前开启一个事务,并在确认消息之后提交事务,以确保消息被成功接收和
2023-10-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录