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

RabbitMQ:生产者可靠性(生产者重连、生产者确认)

目录

  • 一、生产者重连
  • 二、生产者确认


一、生产者重连

当网络不稳定的时候,利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是阻塞式的重试,也就是说多次重试过程中,当前线程是被阻塞的,会影响业务性能。

如果对于业务性能有要求,建议禁用重试机制。如果一定要使用,请合理配置等待时长和重试次数,当然也可以考虑异步线程来执行发送消息的代码。

spring:rabbitmq:connection-timeout: 200ms  # 设置连接超时时间template:retry:enabled: true  # 开启超时重试机制initial-interval: 1000ms  # 失败后的初始等待时间multiplier: 1  # 失败后下次的等待时长倍数,下次等待时长=initial-interval * multipliermax-attempts: 3  # 最大重试次数

二、生产者确认

RabbitMQ有两种确认机制:Publisher ConfirmPublisher Return。开启确认机制后,在MQ成功收到消息后会返回确认消息给生产者,返回的结果有以下几种情况:

  1. 消息投递到了MQ,但是路由失败。此时会通过Publisher Return返回路由异常原因,然后返回ACK,告知投递成功。
  2. 临时消息投递给了MQ,并且入队成功,返回ACK,告知投递成功。
  3. 持久消息投递到MQ,并且入队成功,返回ACK,告知投递成功。
  4. 其他情况都会返回NACK,告知投递失败

在这里插入图片描述
在生产者服务YML文件中增加一下配置:

spring:rabbitmq:publisher-returns: true  # 开启publisher-return机制publisher-confirm-type: correlated  # 设置机制类型:异步

publisher-confirm-type有三种模式可选:

  • none:关闭confirm机制。
  • simple:同步阻塞等待MQ的回执消息。
  • correlated:MQ异步回调方式返回回执消息

每个RabbitTemplate只能配置一个ReturnCallback,因此需要在项目启动过程中配置:

package com.ming.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class CommonConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {log.error(String.format("ReturnsCallback:消息发送失败,应答码 %s,原因 %s,交换机 %s,路由键 %s,消息 %s ...", returnedMessage.getReplyCode(), returnedMessage.getReplyText(), returnedMessage.getExchange(), returnedMessage.getRoutingKey(), returnedMessage.getMessage()));}});}
}

发送消息,指定消息ID,消息ConfirmCallback,此回调每一次发送消息的时候都要指定:

@Test
public void confirmCallbackTest() throws InterruptedException {// 1. 创建cdCorrelationData cd = new CorrelationData();// 2. 增加ConfirmCallbackcd.getFuture().addCallback(new ListenableFutureCallback<CorrelationData.Confirm>() {@Overridepublic void onFailure(Throwable throwable) {  // Spring消息回调失败log.warn("ConfirmCallback:Spring消息回调失败......", throwable);}@Overridepublic void onSuccess(CorrelationData.Confirm confirm) {  // 消息发送回调if (confirm.isAck()) {log.info("ConfirmCallback:RabbitMQ 消息发送成功,收到ACK......");}else {log.warn("ConfirmCallback:RabbitMQ 消息发送成功,收到NACK......", confirm.getReason());}}});// 3. 发送消息rabbitTemplate.convertAndSend("mt.topic", "china.weather", "黄色警报 ......", cd);  // 成功例子// rabbitTemplate.convertAndSend("mt.topic", "aaa", "黄色警报 ......", cd);  // 失败例子Thread.sleep(2000);
}
http://www.dtcms.com/a/340540.html

相关文章:

  • 多模型创意视频生成平台
  • 超高清与低延迟并行:H.266 在行业视频中的落地图谱
  • 【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
  • 关联查询(left/right)优化
  • 50GHz+示波器:精准捕捉超高频信号
  • 激光雷达点云平面拟合与泊松重建对比分析
  • 【ElasticSearch】ElasticSearch Overview
  • Day 40:训练和测试的规范写法
  • 【深度学习新浪潮】空天地数据融合技术在城市三维重建中的应用
  • 学习嵌入式的第二十二天——数据结构——双向链表
  • 前端图片压缩实战:体积直降 80%,LCP 提升 2 倍
  • 数字化图书管理系统设计实践(java)
  • 【考研408数据结构-04】 栈与队列:受限的线性表
  • Java FTPClient详解:高效文件传输指南
  • 用好 Elasticsearch Ruby 传输层elastic-transport
  • Redisson3.14.1及之后连接阿里云redis代理模式,使用分布式锁:ERR unknown command ‘WAIT‘
  • python中selenium怎么使用
  • KUKA机器人KUKA.ConveyorTech传送带跟踪程序举例解析
  • Python采集易贝(eBay)商品详情API接口,json数据返回
  • 今日科技风向|从AI芯片定制到阅兵高科技展示——聚焦技术前沿洞察
  • MySQL 数据库知识点与注意事项总结
  • spring整合JUnit
  • 阿里云ECS服务器的公网IP地址
  • WPF Alert弹框控件 - 完全使用指南
  • Non-stationary Diffusion For Probabilistic Time Series Forecasting论文阅读笔记
  • LoRa 网关与节点组网方案
  • 基于Java虚拟线程的高并发作业执行框架设计与性能优化实践指南
  • 【Bluedroid】A2DP Source 端会话启动流程与核心机制解析(btif_a2dp_source_start_session)
  • UIGestureRecognizer 各个子类以及其作用
  • iOS开发之UICollectionView为什么需要配合UICollectionViewFlowLayout使用