RabbitMQ消息的可靠性

news2024/10/7 16:27:28

RabbitMQ消息的可靠性

一 生产者的可靠性

  1. 生产者重试
    有时候由于网络问题,会出现连接MQ失败的情况,可以配置重连机制
    注意:SpringAMQP的重试机制是阻塞式的,重试等待的时候,当前线程会等待。
spring:
	rabbitmq:
		connection-timout: 1s #设置MQ的连接超时时间
		templete:
			retry:
				enabled: true #开启超时重试机制
				initial-interval: 100ms #失败后的初始等待时间
				multipier: 1 #失败后下次的等待时长倍数, 下次等待时长=initial-interval*multipier
				max-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{
	@Override
	public void setApplicationContext(ApplicationContent applicationContext){
		// 获取MQ
		RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
		// 设置returnCallback
		rabbitTemplate.setReturnCallback((message,replyCode,replyText,exchange,routingKey)->{
	log.info("消息发送失败,应答码:{},原因:{},交换机:{},路由键:{},消息:{}",replyCode,replyText,exchange,routingKey,message.toString());
});
	}
}

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

@Test
public void testPubliserConfir()throw InterupteDException{
	// 创建correlationData
	CorrelationData cd = new CorrelationData(UUID.randowUUID().toString());
	// 给Future添加ConfirmCallback
	cd.getFuture().addCallback(new ListenableFutureCllback<CorelationData.Confirm>(){
	@Override
	public void onFailure(Throwable ex){
		// Future发生异常时的处理逻辑,一般不触发
		log.error("handle message ack fail",ex);
	}
	@Override
	public 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()//开启lazy
	bulid();
}

(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: 1
				acknowledgs-mode: auto #确认机制 none-关闭ack,manual-手动ack,auto-自动
  1. 消费失败处理
    重试机制
spring:
	rabbitmq:
		listenner:
			simple:
				prefetch: 1
				retry:
					enabled: true #开启超时重试机制
					initial-interval: 100ms #失败后的初始等待时间
					multipier: 1 #失败后下次的等待时长倍数, 下次等待时长=initial-interval*multipier
					max-attempts: 3 #最大重试次数
					stateless: true #true为无状态,若业务包含事务,则使用false
					

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

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

四 业务幂等性

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 的执行原理(四)

5.5. MySQL 的查询重写规则 对于一些执行起来十分耗费性能的语句&#xff0c;MySQL 还是依据一些规则&#xff0c;竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以 被称作查询重写。 5.5.1. 条件化简 我们编写的查询语句的搜索条件…

【STM32】ADC(模拟/数字转换)

一、ADC的简介 1.什么是ADC 1&#xff09;将【电信号】-->【电压】-->【数字量】 2&#xff09;ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量&#xff0c;建立模拟电路到数字电路的桥梁。 3&#xff09;12位逐次逼近型ADC&#xff0c;1us转换时间&#xf…

iOS_折叠展开 FoldTextView

1. 显示效果 Test1&#xff1a;直接使用&#xff1a; Test2&#xff1a;在 cell 里使用&#xff1a; 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…

Node.js之fs文件系统模块

什么是fs文件系统模块&#xff1f;又如何使用呢&#xff1f;让我为大家介绍一下&#xff01; fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对文件的操作需求 注意&#xff1a;如果要在JavaScript代码中&#xff0c…

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. 前…

k8s的高可用集群搭建,详细过程实战版

kubernetes高可用集群的搭建 前面介绍过了k8s单master节点的安装部署 今天介绍一下k8s高可用集群搭建 环境准备&#xff1a; vip &#xff1a;192.168.121.99 keeplive master01&#xff1a;192.168.121.153 centos7 master02&#xff1a;192.168.121.154 centos7 master03&a…

Ubuntu20.0中安装Gradle

下载Gradle到temp文件夹 wget https://services.gradle.org/distributions/gradle-8.3-bin.zip -P /tmp 然后解压文件到/opt/gradle目录 sudo unzip -d /opt/gradle /tmp/gradle-8.3.zip 配置Gradle环境变量 接下来我们会创建一个gradle.sh文件来保存Gradle的环境变量 sudo…

图像分类(六) 全面解读复现MobileNetV1-V3

MobileNetV1 前言 MobileNetV1网络是谷歌团队在2017年提出的&#xff0c;专注于移动端和嵌入设备的轻量级CNN网络&#xff0c;相比于传统的神经网络&#xff0c;在准确率小幅度降低的前提下大大减少模型的参数与运算量。相比于VGG16准确率减少0.9%&#xff0c;但模型的参数只…

云存储与物理存储:优缺点对比分析

当您需要存储数字文件时&#xff0c;您有两个基本选择&#xff1a;云存储和物理存储。 云存储允许您通过互联网将文件保存在云存储提供商运营的服务器上。这些公司通常在多个数据中心制作文件的备份副本&#xff0c;并使用复杂的加密来保护它们。您可以从任何连接互联网的设备访…

Docker中快速安装RabbitMQ

文章目录 前言一、安装Docker二、安装RabbitMQ无脑命令行运行 总结 前言 在Ubuntu中的Docker容器中快速安装RabbitMQ&#xff0c;亲测有效&#xff0c;不废话&#xff0c;上操作。 一、安装Docker 直接按照Docker官方教程操作&#xff1a;官方安装教程 点进官网&#xff0c;往…

重命名com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652}文件夹

今天在win10系统上&#xff0c;发现一个名称为: com1.{d3e34b21-9d75-101a-8c3d-00aa001a1652} 的文件夹&#xff0c;该文件夹很奇怪&#xff0c;既不能手动删除&#xff0c;也不能手动给文件夹重命名&#xff0c;如图(1)所示&#xff1a; E:\EncodeOne\hello\Thumbs.ms\com1.…

Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数,导致叠加执行问题解决

Hi, I’m Shendi Nodejs中net模块多次Socket.setTimeout无法覆盖之前函数&#xff0c;导致叠加执行问题解决 问题描述 在 Nodejs 中&#xff0c;net 模块的 Socket 的 setTimeout 函数是设置超时时间&#xff0c;如果多次设置&#xff0c;超时时间会是最后一次的时间&#xff…

RepVgg: 网络结构重参化

CVPR2021 截至目前1004引 论文连接 代码连接 文章提出的问题 大多数的研究者追求的是设计一个好的网络结构,这种“好”体现在网络具有复杂的网络设计,这种网络虽然比简单的网络收获了更加高的准确率,但是网络结构中的大量并行分支,导致模型的难以应用和自定义,主要体现…

PC业务校验(已有该名称,已有该编码)

rules: {name: [{ required: true, message: "部门名称不能为空", trigger: "blur" },{min: 2,max: 10,message: "部门名称的长度为2-10个字符",trigger: "blur",},{trigger: "blur",validator: async (rule, value, callba…

算法通关村第十一关-青铜挑战理解位运算的规则

大家好我是苏麟 , 今天聊聊位运算 . 位运算规则 计算机采用的是二进制&#xff0c;二进制包括两个数码:0&#xff0c;1。在计算机的底层&#xff0c;一切运算都是基于位运算实现的&#xff0c;所以研究清整位运算可以加深我们对很多基础原理的理解程度。 在算法方面&#xf…

HTML5+CSS3+JS小实例:使用L2Dwidget实现二次元卡通看板娘

实例:使用L2Dwidget实现二次元卡通看板娘 技术栈:HTML+CSS+JS 效果: 源码: <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

YOLOv8优化策略:轻量级Backbone改进 | 高效模型 (Efficient MOdel, EMO),现代倒残差移动模块设计 | ICCV2023

🚀🚀🚀本文改进:面向移动端的轻量化网络模型——EMO,它能够以相对较低的参数和 FLOPs 超越了基于 CNN/Transformer 的 SOTA 模型,支持四个版本EMO_1M, EMO_2M, EMO_5M, EMO_6M 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到…

【Python从入门到进阶】42、使用requests的Cookie登录古诗文网站

接上篇《41、有关requests代理的使用》 上一篇我们介绍了requests代理的基本使用&#xff0c;本篇我们来学习如何利用requests的Cookie登录古诗文网。 一、登录网站及目的介绍 我们需要Cookie模拟登录的网站为&#xff1a;https://www.gushiwen.cn/&#xff08;古诗文网&…

Hive调优

1.参数配置优化 设定Hive参数有三种方式&#xff1a; &#xff08;1&#xff09;配置Hive文件 当修改配置Hive文件的设定后&#xff0c;对本机启动的所有Hive进程都有效&#xff0c;因此配置是全局性的。 一般地&#xff0c;Hive的配置文件包括两部分&#xff1a; a&#xff…

LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

接着前两节的Langchain&#xff0c;继续实现Langchain中的Agent LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字 代码实现 # 从langchain库中导入模块 from langchain.llms import OpenAI # 从langchain.l…