RabbitMQ 生产者-消息丢失 之 场景分析

这篇具有很好参考价值的文章主要介绍了RabbitMQ 生产者-消息丢失 之 场景分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生产者消息丢失的场景

  生产者发送消息的流程如下:首先生产者和RabbitMQ服务器建立连接,然后创建信道,通过信道发送消息给RabbitMQ服务器,RabbitMQ服务器接收到消息后交由交换机进行消息存储,交换机根据不同策略将消息路由到指定队列中。在此过程中,可能会存在以下消息丢失的场景:

  • 在发送消息的过程中生产者和RabbitMQ服务连接断开
  • 在发送消息的过程中信道关闭
  • RabbitMQ接收到消息后但是无法匹配到合适的交换机进行消息处理
  • 交换机接收到消息后无法将消息按照相关策略路由到指定队列中
  • 消息存放到队列中,但是一致没有消费者消费,并且消息存放时间超过了设置的过期时间,消息被过期丢失

  按照上述消息丢失场景可以划分为三种情况:消息无法到达RabbitMQ、RabbitMQ无法将消息存放的队列中、消息过期丢失

消息无法到达RabbitMQ

  上述已经分析了消息无法从生产者发送给你RabbitMQ的两种情况,分别是连接端口和信道关闭。

连接断开

测试方法:生产者重复发送消息,在消息发送的过程中将RabbitMQ服务停止。
测试结果:生产者提示异常

Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: connection is already closed due to connection error;

  通过上述测试内容不难发现,如果连接断开则生产者将在消息发送的过程中提示异常,因此可以通过捕获异常的方式进行消息存储,避免消息丢失。

信道关闭

测试方法:生产者重复发送消息,开启一个线程,在一段时间后将信道关闭。
测试结果:生产者提示异常

Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: channel is already closed due to clean channel shutdown; protocol method: #method<channel.close>(reply-code=200, reply-text=OK, class-id=0, method-id=0)

  通过上述测试内容发现信道关闭和连接断开类似,生产者都能接收到异常信息。本测试也可以侧面说明,信道是非线程安全的,不建议去在不同线程间使用相同信道。由于信道是逻辑连接,因此信道关闭后可以通过连接再次创建信道。

RabbitMQ无法将消息入队

  这种消息丢失的场景是指消息被RabbitMQ接收到了,因此针对生产者而言,消息已经成功发送了。单论消息发送的职责,生产者已经完成了;但是不可否认的情况话,RabbiMQ合法的接收到消息后已经可能存在消息丢失的情况,例如处理该消息的交换机不存在,消息无法按照规则路由到相关队列中。

交换机不存在

测试方法:消息发送的过程中写一个不存在的路由名称。
测试结果:生产者提示异常:

Exception in thread “main” com.rabbitmq.client.AlreadyClosedException: channel is already closed due to channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange ‘sample_exchangetest’ in vhost ‘/’, class-id=60, method-id=40)

  虽然生产者提示了该条异常,但是这是在第二次发送信息时提示的异常,也就是说在第一次给不存在的交换机发送消息时,生产者并未抛出异常,当第一条消息发送后,由于不存在相关交换机,则生产者将将该发送消息的信道关闭,进而在第二次通过该信道发送消息的时候提示信道关闭异常.

无匹配队列

测试方法:消息发送的过程中设置一个无法匹配到队列的路由键。
测试结果:生产者持续发送消息,未出现异常,但是队列中不存在生产者发送的消息。
  当消息按照设置规则发送给相关交换机,但是交换机无法根据消息携带的路由键匹配到队列中,此时消息无法存储到队列中,消费者无法消费这些消息。值得注意的是,无匹配队列这种情况发生时,并未向上述几种情况生产者出现异常提示。所以无论生产者无法通过异常监听的方式得知消息发送失败!为此RabbitMQ提供了mandatory属性配置实现当队列不可达时生产者接收到返回消息。mandatory详细讲解见后文。

消息过期丢失

测试方法:在发送消息的过程中设置过期时间。队列无消费者监听,等到消息过期。
测试结果:消息过期丢失,生产者无法获取消息丢失事件。
消息的过期时间设置见: RabbitMQ 过期时间(TTL)文章来源地址https://www.toymoban.com/news/detail-631091.html

消息丢失场景对比

场景 是否发生异常
连接断开
信道关闭
交换机不存在
无匹配队列
消息过期丢失

到了这里,关于RabbitMQ 生产者-消息丢失 之 场景分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RabbitMQ消息可靠性(一)-- 生产者消息确认

    目录 前言 一、消息确认流程图 二、生产者消息确认 1、publisher-confirm(发送者确认) 2、publisher-return(发送者回执) 三、代码实现 1、修改application.yml 配置 2、ConfirmCallback函数和ReturnCallback函数 在项目中,引入了RabbitMQ这一中间件,必然也需要在业务中增加对数据安全性的一

    2024年02月04日
    浏览(72)
  • Spring整合RabbitMQ-配制文件方式-1-消息生产者

    Spring-amqp是对AMQP的一些概念的一些抽象,Spring-rabbit是对RabbitMQ操作的封装实现。 主要有几个核心类 RabbitAdmin 、 RabbitTemplate 、 SimpleMessageListenerContainer 等 RabbitAdmin 类完成对Exchange、Queue、Binding的操作,在容器中管理 了 RabbitAdmin 类的时候,可以对Exchange、Queue、Binding进行自动声

    2024年02月09日
    浏览(42)
  • 【RabbitMQ】RabbitMQ 消息的可靠性 —— 生产者和消费者消息的确认,消息的持久化以及消费失败的重试机制

    在现代分布式应用程序中,消息队列扮演了至关重要的角色,允许系统中的各个组件之间进行异步通信。这种通信模式提供了高度的灵活性和可伸缩性,但也引入了一系列的挑战,其中最重要的之一是消息的可靠性。 首先让我们来了解一下,在消息队列中,消息从生产者发送

    2024年02月05日
    浏览(53)
  • RabbitMQ学习笔记(消息发布确认,死信队列,集群,交换机,持久化,生产者、消费者)

    MQ(message queue):本质上是个队列,遵循FIFO原则,队列中存放的是message,是一种跨进程的通信机制,用于上下游传递消息。MQ提供“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后消息发送上游只需要依赖MQ,不需要依赖其它服务。 功能1:流量消峰 功能2:应用解耦 功

    2024年02月07日
    浏览(54)
  • RabbitMQ初级篇:生产者与消费者关系、消息确认机制(ACK)、交换器与队列进行消息路由和存储

    在RabbitMQ中,生产者(Producer) 负责发送消息 ,通常是应用程序向RabbitMQ服务器发送具有特定路由键的消息;消费者(Consumer)则 负责处理接收到的这些消息 。在RabbitMQ中,生产者和消费者之间使用 交换器(Exchange)和队列(Queue)进行消息路由和存储 。生产者将消息发送到

    2024年02月01日
    浏览(43)
  • 如何在rabbitmq中实现一个生产者,多个消费者,多个消费者都能收到同一条消息

    场景:用户登录,邀请其它用户进行视频会议,收到邀请的用户进入会议 rabbitmq实现思路: 选型:发布订阅模式(Publish/Subscribe) 一个生产者,多个消费者,每一个消费者都有自己的一个队列,生产者没有将消息直接发送到队列,而是发送到了交换机,每个队列绑定交换机,

    2023年04月25日
    浏览(54)
  • Kafka生产者原理 kafka生产者发送流程 kafka消息发送到集群步骤 kafka如何发送消息 kafka详解

    kafka尚硅谷视频: 10_尚硅谷_Kafka_生产者_原理_哔哩哔哩_bilibili ​      1. producer初始化:加载默认配置,以及配置的参数,开启网络线程      2. 拦截器拦截      3. 序列化器进行消息key, value序列化      4. 进行分区      5. kafka broker集群 获取metaData      6. 消息缓存到

    2024年02月11日
    浏览(48)
  • SpringBoot集成RabbitMQ(生产者)

    默认读者已经对SpringBoot和RabbitMQ比较熟悉 SpringBoot集成RabbitMQ(生产者)的步骤如下: 创建SpringBoot工程 Maven添加 spring-boot-starter-amqp 编写application.properties配置RabbitMQ的信息 编写交换机、队列、绑定配置类 在业务逻辑代码中注入RabbitTemplate 调用RabbitTemplate的方法,完成消息推送

    2024年02月15日
    浏览(43)
  • RabbitMQ----生产者可靠性

    生产者可靠性主要分为两个方面: 生产者重连 生产者确认         有的时候由于网络波动,可能会出现客户端连接MO失败的情况。通过配置我们可以开启连接失败后的重连机制: 注意:         当网络不稳定的时候,利用重试机制可以有效提高消息发送的成功率。不

    2024年01月21日
    浏览(51)
  • RabbitMQ-生产者可靠性

            由于网络波动导致客户端无法连接上MQ,这是可以开启MQ的失败后重连机制。         注意:                 是连接失败的重试,而不是消息发送失败后的重试。         这种超时重连的方式是 阻塞式 的,后面的代码没办法执行,如果说业务要求比较严格,则需

    2024年01月21日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包