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

rabbitmq 重试机制

前言

在消息传递过程中,可能会遇到各种问题,如网络故障,服务不可用,资源不足等,这些问题可能导致消息处理失败.为了解决这些问题,RabbitMQ提供了重试机制,允许消息在处理失败后重新发送.

但如果是程序逻辑引起的错误,那么多次重试也是没有用的,如果重复入队反复消费这是不可取的,因此我们可以设置重试次数

配置信息

我们先将 确认模式调成默认的 (auto)

spring:rabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: auto # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数 包括(包括自身消费的⼀次) 

initial-interval 和 max-attempts 大家可以自行发挥

这里的最大重试次数包括自身消费的一次,是指,第一次发送给消费者也算进重试次数

代码演示

AUTO 模式

常量类:

    //消息退回public static final String RETRY_QUEUE = "RETRY_QUEUE";

声明队列:

    //重试机制@Bean("retryQueue")public Queue retryQueue() {return QueueBuilder.durable(MQConstants.RETRY_QUEUE).build();}

生产者:

    @RequestMapping("/retry")public String retry() {rabbitTemplate.convertAndSend("", MQConstants.RETRY_QUEUE, "retry");return "消息发送成功";}

消费者:

@Component
@RabbitListener(queues = "RETRY_QUEUE")
public class RetryListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {System.out.println("接收到的消息:" + messageContent);int n = 10 / 0; //添加异常,观察重试System.out.println("消息消费成功");}
}

运行程序观察:
在这里插入图片描述
在这里插入图片描述

在AUTO模式下,重试次数达到指定次数之后,就会将消息丢弃

NONE 模式

配置信息:

spring:application:name: abbitExtensionDemorabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: none  # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数

NONE 和 AUTO 模式一样,消息达到重试次数之后,就会自动丢弃
在这里插入图片描述
在这里插入图片描述

自动确认模式下,RabbitMQ会在消息被投递给消费者后自动确认消息,如果消费者处理消息时抛出异常,RabbitMQ根据配置的重试参数自动将消息重新入队,从而实现重试.重试次数和重试间隔等参数可以直接在RabbitMQ的配置中设定,并且RabbitMQ会负责执行这些重试策略。

MAMUAL 模式

配置信息

spring:application:name: abbitExtensionDemorabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: manual  # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数

消费者使用手动确认机制:

@Component
@RabbitListener(queues = "RETRY_QUEUE")
public class RetryListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到的消息:" + messageContent);int n = 10 / 0;System.out.println("消息消费成功");channel.basicAck(deliveryTag, false);} catch (Exception e) {channel.basicNack(deliveryTag, false, true);}}
}

在这里插入图片描述
在这里插入图片描述

这里也不受重试次数的限制,一直重新入队

这里的 unacked 是指没有收到确认的消息,不是收到否定确认的消息数量,否定确认和肯定确认都是确认,大家不要混淆


当我们将设置不重新入队的时候:

channel.basicNack(deliveryTag, false, false);

在这里插入图片描述

消息没有进行重试,并且队列也为空了

在这里插入图片描述
可以看到,手动确认模式时,重试次数的限制不会像在自动确认模式下那样直接生效,因为是否重试以及何时重试更多地取决于应用程序的逻辑和消费者的实现.

手动确认模式下,消费者需要显式地对消息进行确认,如果消费者在处理消息时遇到异常,可以选择不确认消息使消息可以重新入队,重试的控制权在于应用程序本身,而不是RabbitMQ的内部机制.应用程序可以通过自己的逻辑和利用RabbitMQ的高级特性来实现有效的重试策略

总结

使用重试机制时需要注意:
1.自动确认和默认模式下:程序逻辑异常,多次重试还是失败,消息就会被自动确认,那么消息就丢失
2. 手动确认模式下:程序逻辑异常,多次重试消息依然处理失败,无法被确认,就一直是unacked的状态,导致消息积压

http://www.xdnf.cn/news/1489771.html

相关文章:

  • Windows netstat 命令使用说明
  • ZSet
  • 5G NR PDCCH之信号调制
  • 【redis 基础】redis 的常用数据结构及其核心操作
  • GD32自学笔记:5.定时器中断
  • 3D 版接雨水
  • 【系统架构设计(20)】构件与中间件技术
  • 写程序or打游戏(组合计数)
  • 美股市场股票数据API对接文档
  • compute_class_weight函数介绍
  • 独角数卡对接蓝鲸支付平台实现个人
  • 26考研——内存管理_内存管理策略(3)
  • 解锁服务器网络配置新姿势:Wisdom SSH 助力之旅
  • (RDFS)随机深度特征选择方法解释:简而言之,RDFS主要针对的是恶意的服务器,它建立在客户端是诚实的前提下。
  • 【PS2025全网最新版】稳定版PS2025保姆级下载安装详细图文教程(附安装包)(Adobe Photoshop)
  • 深入理解OpenHarmony中的BUILD.gn:从语法到模块化构建
  • Java Modbus通信实战(四):Modbus通信测试与故障排查
  • 深入理解 X25519 与 Ed25519:密钥交换与签名验签全流程解析
  • kafka特性和原理
  • 系统架构性能优化与容灾设计深度解析
  • Spring的容器扩展机制三大基石
  • Spark mapreduce 的一个用法
  • SQLite的基本操作
  • 使用 nginx-module-vts 进行 Nginx 流量监控
  • 【多模态学习】QA3:FFN的作用?Embedding生成方法的BERT和Word2Vec?非线性引入的作用?
  • 单片机的bin、exe、elf、hex文件差异
  • Shell 秘典(卷十)—— 服务器资源自动化监控脚本的设计与实现
  • Kubernetes实战系列(5)
  • 多功能台灯设计与实现(论文+源码)
  • 155. 最小栈