当前位置: 首页 > news >正文

消息队列RabbitMQ-使用过程中面临的问题与解决思路

消息队列在使用过程中会出现很多问题

首先就是消息的可靠性,也就是消息从发送到消费者接收,消息在这中间过程中可能会丢失

生产者到交换机的过程、交换机到队列的过程、消息队列中、消费者接收消息的过程中,这些过程中消息都可能会丢失。

这对上述过程,RabbitMQ分别对应的解决方案是生产者确认机制、持久化机制、消费者确认机制、消费者失败重试机制。

生产者确认机制,就是保证消息在生产者到交换机的过程、交换机到队列的过程不会丢失的机制。这种机制给每一个消息指定了唯一的ID,消息从生产者到交换机、从交换机到队列中的阶段都会返回一个结果,消息从生产者到交换机会通过返回一个布尔值来反馈消息是否送到了交换机,即发送者确认publisher-confirm。如果消息投递到了交换机但是没有到队列,就会返回ACK及路由失败原因,即发送者回执publisher-return。

持久化机制,就是保证消息在消息队列中不会丢失的机制。比如消息发送到RabbitMQ中,突然发生宕机,将会导致消息丢失。消息持久化机制包括:交换机持久化、队列持久化、消息持久化。默认情况下由SpringAMQP声明的交换机和队列都是持久化的。可以在RabbitMQ控制台上看到叫交换机和队列的features字段上标示D。利用SpringAMQP发送消息时,可以设置消息的属性MessageProperties,指定为delivery-mode。

消费者消息确认机制,在此机制下RabitMQ会根据消费者的回执来确认消费者是否成功处理消息,然后在确定是否删除消息。SpringAMQP确认模式默认是auto,由spring检测listenner代码是否出现异常,没异常返回ack,有异常返回nack。当然还有manual手动ack模式,和none无ack模式。unacked会在控制台queues中的messas中显示,并回复到Ready状态,不会被RabbitMQ删除、并且会重新投递。但是消息不断的重入队(发送消息、出现异常、在重入队),出现了死循环,这是就要依靠消费者失败重试机制了。

消费者失败重试机制主要实现靠两方面

1.将重入队利用Spring的retry机制改为本地重试,可以通过修改消费者服务模块的application.ym文件。

spring:rabbitmq:listener:simple:retry:enabled: true # 开启消费者失败重试initial-interval: 1000 # 初始的失败等待时长为1000毫秒=1秒multiplier: 2 # 每次重试尝试时间间隔增加因子max-attempts: 3 # 最大重试次数,达到最大重试次数后,消息默认会被丢弃stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false

上述配置完成,触发本地重试,在重试3次后,SpringAMQP会抛出异常AmqpRejectAndDontRequeueException,并且控制台上消息被删除了,意味着SpringAMQP返回的是ack,mq删除消息了。

2.指定消息重试失败的失败策略,默认的是直接丢弃消息,也可以设置将其失败后重新入队(不建议,没意义),推荐的是将失败的消息投递到指定的队列,这个队列专门存放异常消息,后续方便人工处理。

http://www.lryc.cn/news/300236.html

相关文章:

  • 搜索Agent方案
  • 排序算法---计数排序
  • STM32——LCD(1)认识
  • iTop-4412 裸机程序(二十二)- RTC时钟
  • Kafka 之 AdminClient API
  • Flutter run 一直 Running Gradle task ‘assembleDebug’…
  • kali无线渗透之用wps加密模式破解出wpa模式的密码12
  • 【Python】高级数据类型
  • 挑战杯 python区块链实现 - proof of work工作量证明共识算法
  • 如何给最小化安装的CentOS主机装个远程桌面?
  • 知识图谱:py2neo将csv文件导入neo4j
  • 备战蓝桥杯---图论之最短路Bellman-Ford算法及优化
  • C++ //练习 5.19 编写一段程序,使用do while循环重复地执行下述任务:首先提示用户输入两个string对象,然后挑出较短的那个并输出它。
  • 算法刷题:有效三角形个数
  • python---变量
  • 数据库第二次实验
  • 容器高级知识:Kubernetes Pod 适配器模式详解
  • 云原生容器化-5 Docker常见操作命令
  • 几道简单的题目练一下手感
  • 2023年哪个前端框架用的最多?
  • 基于BitVM的乐观 BTC bridge
  • 谷歌浏览器安装扩展程序axure-chrome-extension
  • C++学习:大小写转换
  • 【王道数据结构】【chapter5树与二叉树】【P159t16】
  • 代码随想录算法训练营第51天 | 139.单词拆分 多重背包理论基础
  • weilai8游戏爬虫
  • 【Java程序设计】【C00261】基于Springboot的休闲娱乐代理售票系统(有论文)
  • 【Linux】学习-基础IO拓展篇
  • 算法详解(力扣141——环形链表系列)
  • 浅谈路由器交换结构