【学习笔记】RabbitMQ-5 消息的可靠性投递 以及示例代码

参考资料

  • RabbitMQ官方网站
  • RabbitMQ官方文档
  • 噼咔噼咔-动力节点教程

文章目录

    • 八、RabbitMQ的确认机制 -confirm
      • 8.1 Confirm 模式简介
      • 8.2 具体代码设置
        • 8.2.1 **设置思路**:
        • 8.2.2 **代码实现**
        • 8.2.2.1 开启生产者的确认模式.
        • 8.2.2.2 实现接口ComfirmCallback
        • 8.2.2.3 配置rabbitTemplate并发送消息
        • 8.2.2.3 测试运行
      • 8.3 使用匿名内部类优化代码写法
      • 8.4 :star: 推荐-使用lambda表达式实现确认模式
    • 九、RabbitMQ消息Return模式
      • 9.1 返回模式概念
      • 9.2 具体代码设置
        • 9.2.1 开启确认模式
        • 9.2.2 实现ReturnsCallback接口
        • 9.2.3 设置回调函数
        • 9.2.3 :star:代码用例(lambda
        • 9.2.4 测试结果
      • 9.3 :star:使用Lambda函数实现返回模式
    • 十、RabbitMQ交换机的属性
      • 10.1 具体属性
      • 10.2 交换机持久化
      • 10.3 自动删除
      • 10.4 内部交换机和备用交换机

八、RabbitMQ的确认机制 -confirm

8.1 Confirm 模式简介

消息队列的 confirm 确认机制,是指生产者投递消息后,到达了消息服务器 Broker 里面的exchange 交换机,则会给生产者一个应答,生产者接收到应答,用来确定这条消息是否正常的发送到 Broker 的 exchange 中。

这也是消息可靠性投递的重要保障。

用于确保消息传递是否正常,但是会牺牲一些性能,但是提高了系统运行的稳定性

image-20231017161931900

8.2 具体代码设置

8.2.1 设置思路

image-20231017162057149

8.2.2 代码实现

基于之前的案例中的直连路由器进行测试。

需要传递如下的参数才能成功发送消息。

image-20231017164313453

8.2.2.1 开启生产者的确认模式.

在配置文件中,开启生产者的确认模式:

  • 与CorrelationData一起使用可将确认与已发送的消息关联起来。
# Use with CorrelationData to correlate confirmations with sent messsages.
publisher-comfirm-type: correlated
8.2.2.2 实现接口ComfirmCallback
@Component
@Slf4j
public class DemoRabbitCallback implements RabbitTemplate.ConfirmCallback {/*** 证实** @param correlationData 相关数据* @param ack             是否应答成功* @param cause           原因*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (ack){log.info("(确认模式) 消息正常发送:{}" , correlationData);return;}log.error("(确认模式) 消息发送异常 :{},异常原因:{}" , correlationData , cause);}
}
8.2.2.3 配置rabbitTemplate并发送消息
@RestController
@RequestMapping("/confirm")
@Slf4j
public class ConfirmTestController {@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate DemoRabbitCallback demoRabbitCallback;@PostConstructpublic void init() {rabbitTemplate.setConfirmCallback(demoRabbitCallback);log.info("(确认模式)成功配置回调方法");}@GetMapping("/{key}")public void sentErrorMsg(@PathVariable("key") String key) {String msg = "...确认模式测试消息...";// 声明一个相关性数据,可以用于辅助确认本次请求的信息CorrelationData correlationData = new CorrelationData();String uuid = "ORDER_NUM_"+UUID.randomUUID();correlationData.setId(uuid);log.info("(确认模式)准备发送的信息:{} , 交换机名称是 :{} , 相关数据信息:{} ", msg, key , correlationData);//  发送消息时添加参数:CorrelationDatarabbitTemplate.convertAndSend(key,"error",msg.getBytes(StandardCharsets.UTF_8),correlationData);}
}
8.2.2.3 测试运行

尝试发送一个交换机名称错误的信息。异常信息如下:

(确认模式) 消息发送异常 :CorrelationData [id=ORDER_NUM_084864b0-ee07-4e60-b19c-d360edeecb27],异常原因:channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'xcong.directaaaaa' in vhost 'hc-test', class-id=60, method-id=40)

发送一个正确的名称时/confirm/xcong.direct:也会打印日志:

(确认模式) 消息正常发送:CorrelationData [id=ORDER_NUM_744c6441-4075-4c4b-ba3f-530578b901aa]

进入控制台也可以看该消息,而且可以发现,相关信息是存放在headers中

image-20231017165933441

8.3 使用匿名内部类优化代码写法

教程里提到的写法,将消息发送的服务和回调方法的实现合在一个类中完成。类似下面这样

image-20231017170358826

省一个类而已,局限性比较大,不适合全局部署。根据实际需求场景使用。

另外一种方法即使用匿名内部类。效果如下,跟上面的方法类似,不是很好用。

image-20231017170608219

8.4 ⭐️ 推荐-使用lambda表达式实现确认模式

  • 代码简洁
  • 阅读直观

当接口只有一个方法,且添加了注解@FunctionalInterface时,就可以尝试用lambda表示简洁写法

最终效果改造如下(测试和之前的示例一样

@RestController
@RequestMapping("/v2/confirm")
@Slf4j
public class ConfirmTestController2 {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init() {rabbitTemplate.setConfirmCallback(// 参数类型可以省略 CorrelationData correlationData, boolean ack, String cause(correlationData, ack, cause) -> {if (ack) {log.info("(确认模式) 消息正常发送:{}", correlationData);return;}log.error("(确认模式) 消息发送异常 :{},异常原因:{}", correlationData, cause);});log.info("(确认模式)成功配置回调方法");}

九、RabbitMQ消息Return模式

9.1 返回模式概念

刚才我们已经确保了“生产者——>交换机”的消息可靠性,接下来的返回模式就是确保“exchange——>queue”的消息可靠性

  • P -> X ——确认模式
  • X -> Q ——返回模式

9.2 具体代码设置

思路和确认模式类型,不贴代码了,直接截图作为参考即可

9.2.1 开启确认模式

在配置文件中开启确认模式

publisher-returns: true
9.2.2 实现ReturnsCallback接口

image-20231017172335306

9.2.3 设置回调函数

image-20231017172353571

9.2.3 ⭐️代码用例(lambda
@Slf4j
@RestController
@RequestMapping("/return")
public class ReturnTestController {@Resourceprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init() {rabbitTemplate.setReturnsCallback((returnedMessage) -> {log.info("(返回模式) 异常信息内容是:{}", returnedMessage);});}@GetMapping("/{key}/{msg}")public void sentErrorMsg(@PathVariable("msg") String msg, @PathVariable("key") String key) {log.info("(返回模式) 准备发送的信息:{} , 路由键 :{}", msg, key);rabbitTemplate.convertAndSend(exchangeName, key, msg.getBytes(StandardCharsets.UTF_8));}}
9.2.4 测试结果
  • 发送一个错误的路由key/return/error1/返回模式测试消息

    image-20231018092413244

  • 发送一个正确的路由key时:不会触发回调函数

    image-20231018092449880

9.3 ⭐️使用Lambda函数实现返回模式

@PostConstruct
public void init() {rabbitTemplate.setReturnsCallback(returnedMessage-> {log.info("(返回模式) 异常信息内容是:{}", returnedMessage);});
}

十、RabbitMQ交换机的属性

10.1 具体属性

Snipaste_2023-10-18_10-16-13

  1. Name:名称
  2. Type:类型,direct/fanout/topic/headers
  3. Durability:持久化
  4. auto Delete:自动删除。
  5. intenal:内部交换机
  6. Arguments:自定义参数
    • Alternate exchange:备用交换机

10.2 交换机持久化

  • 声明交换机是否持久化,服务器重启后是否还在
  • 默认是持久化
  • 如果是非持久化,服务器重启后,交换机的数据就会丢失

10.3 自动删除

  • 如果true,当所有的队列和交换接触和交换机的绑定后,交换器将删除自身
  • 删除的结点:最后一个队列或者交换机接触绑定时。
  • 默认为false

10.4 内部交换机和备用交换机

  • intenal属性值为yes(true)时,该交换机无法被客户端直接访问,只能作为和其他交换机的相互绑定中。
  • 在参数配置中,添加alternate-exchange的值,可以声明一个备用交换机:
    • 当一个消息无法被routed时,可以将他们的信息转发到备用交换机上。

实际的应用场景

可以用于存储客户端发送错误routingKey的信息,防止消息发送时指定了错误的key,导致消息丢失的情况。

也是一种保证消息可靠性投递的方式

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

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

相关文章

Git 分布式版本控制工具

目录 1. 前言1.1 什么是Git1.2 使用Git能做什么 2. Git概述2.1 Git简介2.2 Git下载与安装 3. Git代码托管服务3.1 常用的Git代码托管服务3.2 码云代码托管服务3.2.1 注册码云账号3.2.2 登录码云3.2.3 创建远程仓库3.2.4 邀请其他用户成为仓库成员 4. Git常用命令4.1 Git全局设置…

Flume 整合 Kafka

1.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合后的数据输入到 Storm 等分布式计算框架中,可能就会超过集群的处理能力,这时采用 Kaf…

品牌创意二维码营销活动:MoneyLion 在纽约全城“撒钱”,月增百万级曝光!

在2023年4月——金融知识月&#xff0c;MoneyLion 在纽约策划了一场轰动全城的“撒钱”活动&#xff01; 在开始介绍这场极具创意的活动之前&#xff0c;我们先来了解一下MoneyLion这家公司。MoneyLion 是一家私营金融科技公司&#xff0c;为消费者提供贷款、财务咨询和投资服…

Apache Doris (四十二): RECOVER数据删除恢复

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

HTML 常用标签及练习

常用标签 <head>中的标签 概述 head中的内容不显示到页面上 标签说明<title>定义网页的标题<meta>定义网页的基本信息&#xff08;供搜索引擎&#xff09;<style>定义CSS样式<link>链接外部CSS文件或脚本文件<script>定义脚本语言<…

源码编译安装部署lnmp

源码编译安装部署lnmp 文章目录 源码编译安装部署lnmp1.简介&#xff1a;2.环境说明&#xff1a;3.部署前的准备工作4.安装nginx4.1.进入官网拉取nginx源码包4.2.通过IP地址访问nginx的web页面 5.安装mysql5.1.安装依赖包5.2.创建用户和组5.3.下载源码包并解压到/usr/local/5.4…

Helm upgrade 时 no matches for kind “xxxx“ in version “xxxx“ 问题处理

1. 问题 kubernetes 升过级&#xff0c;但是 helm release 旧版本中有新版本 api 弃用的 version。 在 helm upgrade 时就出现类似如下版本不匹配的错误&#xff0c;导致 helm upgrade 失败。 当然 helm uninstall 再重新安装可能可以跳过这个问题&#xff08;只要 charts 不再…

移动端1px-从基本原理到开源解决方案介绍

1px 不够准确&#xff0c;应该说成 1 物理像素 为什么有 1px 这个问题&#xff1f;实现 1px 有哪些方法&#xff1f;这些方法分别有哪些优缺点&#xff1f;开源项目中使用的哪些解决方案&#xff1f;如何在项目中处理 1px 的相关问题&#xff1f; 基本概念 首先&#xff0c;我们…

给cmd控制台程序 套壳 美化

给cmd控制台程序套壳美化&#xff0c;可以获取程序的标准输出和报错信息。 # _*_ coding: utf-8 _*_ """ 控制台程序启动器&#xff0c;杜绝黑窗口。 Time: 2023/10/18 15:28 Author: Jyun Version: V 0.1 File: main.py Blog: https://ctrlcv.…

Python中Numpy的应用技巧

目录 1. 什么是 NumPy?2. NumPy 中的数组2.1. 创建数组2.2. 用Numpy的数据2.2.1. OpenCV2.2.2. Pandas 3. 数学计算3.1. 四则计算3.1.1. 矩阵乘法3.1.2. 点乘 3.2. 求逆矩阵与伪逆矩阵3.3. 判断矩阵相等3.4. np.eye()函数生成对角阵 4. 统计4.1. 最大值、最小值、均值条件4.2.…

在 Python 中如何向列表或数组添加元素

在这篇文章中&#xff0c;你将了解 Python 中的 .append() 方法。你还会看到 .append() 与其他用于向列表添加元素的方法有什么不同。 让我们开始吧&#xff01; Python 中的列表是什么&#xff1f;给初学者的定义 编程中的数组是一个有序的项目集合&#xff0c;所有的项目都…

【Linux-常用命令-基础命令-解压rar文件-unrar-x-命令-笔记】

【Linux-常用命令-基础命令-解压rar文件-unrar-x-命令-笔记】 1、前言2、操作3、自己的操作 1、前言 最近&#xff0c;在使用Linux的时&#xff0c;使用相关基础命令是&#xff0c;总是容易忘记&#xff0c;上网一搜&#xff0c;大部分都写的比较繁琐&#xff0c;解压不同文件…

XCode15与iOS17/17.1 真机测试问题处理

XCode15与iOS17/17.1 真机测试问题处理&#xff0c;网上相关博客很多&#xff0c;摘录了如下实践后能起作用的地址如下&#xff1a;Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下&#xff1a;Assertion failure in void _UIGraphicsBeginImag…

Linux编译内核添加Bcache模块

由于Bcache是在linux kernel 3.10之后才加入的&#xff0c;所以要使用Bcache&#xff0c;首先必须确保内核版本至少是3.10或及以上&#xff0c;可以使用uname -a查看内核版本 [rootceph01 ~]# uname -a Linux ceph01 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC…

在Linux中,怎么查看自己电脑的系统架构是什么?

2023年10月18日&#xff0c;周三晚上 这些命令会返回一个字符串&#xff0c;表示系统的架构。 常见的架构包括 x86&#xff08;32位&#xff09;、x86_64&#xff08;64位&#xff09;、ARM 等。 方法1&#xff1a;使用uname命令 uname -m方法2&#xff1a;使用arch命令 ar…

如何查看前端项目vue版本

&#xff08;1&#xff09;点击package.json文件 &#xff08;2&#xff09;找到dependencies下面的value &#xff08;2&#xff09;查看vue版本 2开头为vue2 3开头为vue3

从零开始了解协同OA办公系统,一篇文章就够了!

随着现代企业管理的不断发展&#xff0c;越来越多的企业开始关注协同OA办公系统&#xff0c;以提高工作效率和降低成本。但是&#xff0c;很多企业对协同OA办公系统并不了解&#xff0c;甚至不知道该如何开始使用。本文将从零开始&#xff0c;为大家详细介绍协同OA办公系统。 一…

【数据结构】排序算法的稳定性分析

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Java使用javah命令:‘javah‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

前提是已安装jdk&#xff0c;配置JDK环境变量&#xff0c;并成功输出下图&#xff1a; 但在命令行窗口使用javah&#xff0c;找不到该命令&#xff1a; 原因&#xff1a;新版的Java不使用javah的命令了&#xff0c;而是使用javac -h 用法&#xff1a; javac -h <directory&…

软件测试全套教程,软件测试自学线路图

目录 一、简介 二、引言 为什么要做接口自动化测试&#xff1f; 为什么要自己写框架呢&#xff1f; 三、环境准备 四、测试接口准备 接口代码 接口信息 五、编写接口测试 测试思路 脚本实现 六、优化 封装接口调用 保持cookies&增加log信息 封装重复操作 七…