RabbitMQ消息的可靠性

RabbitMQ消息的可靠性

一 生产者的可靠性

  1. 生产者重试
    有时候由于网络问题,会出现连接MQ失败的情况,可以配置重连机制
    注意:SpringAMQP的重试机制是阻塞式的,重试等待的时候,当前线程会等待。
spring:rabbitmq:connection-timout: 1s #设置MQ的连接超时时间templete:retry:enabled: true #开启超时重试机制initial-interval: 100ms #失败后的初始等待时间multipier: 1 #失败后下次的等待时长倍数, 下次等待时长=initial-interval*multipiermax-attempts: 3 #最大重试次数
  1. 生产者确认

    (1)在生产者服务的yaml文件中配置一下内容
spring:rabbitmq:publisher-confirm-type: correlated #开启publisher confirm机制,并设置为MQ异步回调方式返回回执信息publisher-returns: true #开启publisher return机制

(2)配置return-callback

@Slf4j
@Configuration
public class CommonConfig implements ApplicationContexAware{@Overridepublic void setApplicationContext(ApplicationContent applicationContext){// 获取MQRabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 设置returnCallbackrabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey)->{log.info("消息发送失败,应答码:{},原因:{},交换机:{},路由键:{},消息:{}",replyCode,replyText,exchange,routingKey,message.toString());
});}
}

(3)发送消息,指定消息ID,消息的ConfirmCallback
相比于发布消息,多了消息的confirm

@Test
public void testPubliserConfir()throw InterupteDException{// 创建correlationDataCorrelationData cd = new CorrelationData(UUID.randowUUID().toString());// 给Future添加ConfirmCallbackcd.getFuture().addCallback(new ListenableFutureCllback<CorelationData.Confirm>(){@Overridepublic void onFailure(Throwable ex){// Future发生异常时的处理逻辑,一般不触发log.error("handle message ack fail",ex);}@Overridepublic void onSuccess(CorrelationData.Confirm result){// Future接收到回执的处理逻辑if(result.isAck()){log.debug("发送消息成功,收到ACK");}else{log.error("发送消息失败,收到NACK,reason:{}",result.getReson());}}
});
// 发送消息
rabbitTemplate.coverAndSend("hmall.direct","red","hello",cd);
}

二 MQ的可靠性

MQ的持久化可以使用Lazy Queue
(1)通过配置类

@Bean
public Queue lazyQueue(){return QueueBuilder.durable("lazy.queue")// 队列名称.lazy()//开启lazybulid();
}

(1)基于注解

@RabbitListener(queuesToDeclare = @Queue(name="lazy.queue",durable="ture",arguments=@Argument(name="x-queue-mode",value="lazy")
))
public void listenLazyQueue(String msg){log.info("接收到 lazy.queue的消息:{}",msg);
}

三 消费者确认

  1. 消费者确认机制
    在这里插入图片描述
    可以通过配置来进行确认
spring:rabbitmq:listenner:simple:prefetch: 1acknowledgs-mode: auto #确认机制 none-关闭ack,manual-手动ack,auto-自动
  1. 消费失败处理
    重试机制
spring:rabbitmq:listenner:simple:prefetch: 1retry:enabled: true #开启超时重试机制initial-interval: 100ms #失败后的初始等待时间multipier: 1 #失败后下次的等待时长倍数, 下次等待时长=initial-interval*multipiermax-attempts: 3 #最大重试次数stateless: true #true为无状态,若业务包含事务,则使用false

失败处理策略
在这里插入图片描述
在这里插入图片描述
代码实现

@Slf4j
@Configureation
@ConditionalOnProperty(prefix="spring.rabbitmq.listenner.simple.retry",name="enable",havingValue="true")// 只有重试机制是true才生效
public class ErrorConfiguration{@Bbeanpublic DirectExchange errorExchange(){return new DirectExchange("error.direct");}@Beanpublic Queue errorQueue(){return new Queue("error.queue");}@Beanpublic Binding errorBinding(DirectExchange errorExchange,Queue errorQueue){return BindingBuilder.bind(errorQueue).to(errorExchange).with("eooro");}/*** 重试失败处理策略* RepublishMessageRecoverer:重试失败后,将消息发送到指定的队列中*/@Beanpublic MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate){log.info("MessageRecoverer 重试失败处理策略配置");return new RepublishMessageRecoverer(rabbitTemplate,"error.direct","error");}
}

四 业务幂等性

  1. 消息唯一id
  2. 业务判断
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/194436.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSI参考模型

目录 一. OSI参考模型的各层功能二. 网络排错三. 网络安全四. 实体、协议、服务和服务访问点SAP五. TCP IP体系结构 一. OSI参考模型的各层功能 \quad \quad \quad \quad 我们首先来看应用层实现的功能 每个字段的各种取值所代表的意思 \quad \quad 比如要保存的文件内容是ab…

Linux 网络:PMTUD 简介

文章目录 1. 前言2. Path MTU Discovery(PMTUD) 协议2.1 PMTUD 发现最小 MTU 的过程 3. Linux 的 PMTUD 简析3.1 创建 socket 时初始化 PMTUD 模式3.2 数据发送时 PMTUD 相关处理3.2.1 源头主机发送过程中 PMTU 处理3.2.2 转发过程中 PMTUD 处理 4. PMTUD 观察5. 参考链接 1. 前…

配置VNC环境时,出现xauth: file /root/.Xauthority does not exist的解决方案。

问题描述 在配置VNC&#xff08;Virtual Network Computing&#xff09;环境的过程时&#xff0c;首先安装了tigervnc-server包。在使用&#xff1a; vncserver命令创建VNC会话号的时候出现了一个报错&#xff1a;xauth: file /root/.Xauthority does not exist 原因分析&…

【Linux进阶之路】动静态库

文章目录 回顾一. 静态库1.代码传递的方式2.简易制作3.原理 二. 动态库1.简易制作2.基本原理 尾序 回顾 前面在gcc与g的使用中&#xff0c;我们简单的介绍了动态库与静态库的各自的优点与区别&#xff1a; 动态链接库&#xff0c;也就是所有的程序公用一份代码,虽然方便省空间&…

SpringBoot 整合 JdbcTemplate

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

Go——一、Go语言安装及介绍

Go 一、Windows下安装Go1、下载Go2、配置环境变量3、下载Jetbrain下的GoLang4、编写hello world5、编译和执行 二、Go语言介绍1、开发文档2、Go语言核心开发团队3、为什么要创建Go4、Go语言发展史5、Go语言特点6、Golang执行过程6.1 执行过程分析6.2 编译是什么 7、开发注意事项…

RobotFramework进阶之自定义的python模块(十四)

引言 RobotFramework自动化框架&#xff08;以下简称RF&#xff09;之前文章我们讲了通过import第三方的library&#xff08;RequestsLibrary等&#xff09;&#xff0c;在实际项目中第三方的包并不能满足我们的需要&#xff0c;此时我们可自己编写python模块&#xff08;.py文…

算法通关村第十六关白银挑战——滑动窗口高频问题

关注微信公众号&#xff1a;怒码少年。回复关键词【电子书】&#xff0c;领取多本计算机相关电子书 公众号后台开启了咨询业务&#xff0c;欢迎大家向我提问&#xff0c;免费&#xff0c;为爱发电&#x1f60e; 大家好&#xff0c;我是怒码少年小码。 武汉今天真的超级冷&…

pr出现由于找不到msvcp110.dll,无法继续执行代码怎么办?如何修复

为什么我们在打开运行电脑软件会出现msvcr110.dll无法继续执行此代码的问题呢&#xff1f;因为msvcr110.dll是Microsoft Visual C Redistributable Package for Visual Studio 2013的一个动态链接库。它是一个重要的组件&#xff0c;用于帮助游戏和软件运行。如果某个程序是用它…

volatile 无法保证原子性 案例展示

volatile 无法保证原子性 在 Java 中&#xff0c;原子性是指一个操作是不可中断的&#xff0c;要么都执行要么都不执行。 但是 volatile 修饰的变量&#xff0c;只是保证了从主内存加载到工作内存的值是最新的&#xff0c;并不能保证对变量的操作是原子性的 变量的写操作和读…

OS 进程同步

基本概念 定义&#xff1a;把异步环境下的一组并发进程因直接制约而相互发送消息、相互合作、相互等待&#xff0c;使得各进程按一定的速度执行的过程&#xff0c;称为进程同步 协作进程&#xff1a;具有同步关系的一组并发进程 进程同步机制的主要任务&#xff1a;在执行次…

laravel-admin导出excel全部,表中无id列导出失败

laravel-admin导出excel时&#xff0c;导出全部数据&#xff0c;但是表中没有id字段&#xff0c;然后就无法导出excel&#xff1b; 就直接显示 一开始我也很着急&#xff0c;弄了半天还是不行&#xff0c;然后重写还是有问题 最后发现底层代码排序是按照id排序的orderBy(id, a…