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

news2025/1/13 10:11:23

参考资料

  • 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           原因
     */
    @Override
    public 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 {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Resource
    private DemoRabbitCallback demoRabbitCallback;


    @PostConstruct
    public 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);
        //  发送消息时添加参数:CorrelationData
        rabbitTemplate.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 {

    @Resource
    private RabbitTemplate rabbitTemplate;


    @PostConstruct
    public 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 {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @PostConstruct
    public 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.coloradmin.cn/o/1105043.html

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

相关文章

Transformer模型 | Transformer模型描述

谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快…

浪涌防护:TSS管的工作原理与应用?|深圳比创达EMC

浪涌防护&#xff1a;TSS管的工作原理与应用&#xff1f;相信不少人是有疑问的&#xff0c;今天深圳市比创达电子科技有限公司就跟大家解答一下&#xff01; 一、TSS工作原理 TSS半导体放电管是一种电压开关型瞬态抑制二极管&#xff0c;即涌压抑制晶体管&#xff0c;或称为导…

大中小企业自招人力及劳务派遣招聘

抖音直播招聘报白是一种通过直播方式展示职位信息并与求职者互动的招聘方式。在抖音平台上&#xff0c;企业或人力资源公司可利用直播将职位以视频直播的方式展现&#xff0c;这种方式可给求职者带来更强的代入感和真实性&#xff0c;解决其对岗位真假难辨的信任问题。 图片 …

SCB-Dataset3 公开 学生课堂行为数据集: A Benchmark for Detecting Student Classroom Behavior

公开 学生课堂行为数据集 SCB-Dataset 2 Student Classroom Behavior dataset b站&#xff1a;https://www.bilibili.com/video/BV1D34y1g76E/ arxiv: https://arxiv.org/pdf/2310.02522.pdf github: https://github.com/Whiffe/SCB-dataset 百度云&#xff1a;https://pan…

如何选择适合的发电机测试设备?

选择适合的发电机测试设备需要考虑电机的额定功率和负载需求&#xff0c;选择能够满足需求的测试设备&#xff0c;确保测试设备的功率范围覆盖发电机的额定功率&#xff0c;并有一定的余量。常见的发电机测试项目包括电压、电流、频率、功率因数、转速、温度等参数的测试&#…

PCB布线时如何保证100M以上信号的稳定性?

PCB布线时是电子工程中非常重要的环节&#xff0c;对于保证信号的稳定性和完整性至关重要&#xff0c;若电子工程师遇上100M以上信号的布线需求&#xff0c;该如何设计来保证其稳定性&#xff1f;下面或许能给你些参考。 1、选择合适的传输介质 对高速信号&#xff0c;选择合适…

基于 SaaS 搭建的党建小程序源码系统 带完整的搭建教程

随着互联网技术的发展和应用的普及&#xff0c;传统的党建模式已经难以满足现代社会的需求。为了更好地服务党员和群众&#xff0c;提高党组织的凝聚力和战斗力&#xff0c;基于 SaaS搭建的党建小程序源码系统应运而生。小程序的出现可以很好的解决大多数问题&#xff0c;方便了…

数字孪生与智慧城市:重塑未来城市生活的奇迹

今天&#xff0c;我们将探讨数字孪生和智慧城市两个颠覆性技术&#xff0c;它们正引领着未来城市生活的巨大变革。随着科技的飞速发展&#xff0c;数字孪生和智慧城市成为实现可持续发展和提升居民生活质量的关键策略。 数字孪生&#xff1a;实现现实与虚拟的完美融合 数字孪生…

AI工具在工作中的“大作用”

现如今科技的发展让我们的生活越来越便利&#xff0c;一些AI工具的出现&#xff0c;更对我们的工作有莫大的帮助。 AI工具的辅助就像给上班族提供了一种更加高级的“摸鱼方法”&#xff0c;大大提高了打工人的工作效率。如果有一种什么都能回答你&#xff0c;甚至能帮助你完成…

用例图包含关系、扩展关系、泛化关系解析(最全总结,非常详细)

一、用例图中的各种关系 a&#xff09;参与者与用例间的关联关系&#xff1a;参与者与用例之间的通信&#xff0c;也成为关联或通信关系。 b&#xff09;用例与用例之间的关系&#xff1a;包含关系&#xff08;include&#xff09;、扩展关系&#xff08;extend&#xff09;、…

智慧机场航线监测系统:提升航空运输安全与效率的新一步

在当今世界&#xff0c;空中出行已经成为越来越多人生活的一部分。人们频繁地乘坐飞机来往各地&#xff0c;全球航空旅行需求不断增长&#xff0c;航空运输业已经变得越来越复杂。在这个复杂性不断增强的行业中&#xff0c;智慧机场应用航线监测系统成为了航空领域关键的发展趋…

LeetCode2652——倍数之和

LeetCode2562 自己的解法&#xff1a; 官方给的解法&#xff08;不需要创建额外的数组&#xff0c;更为简洁&#xff0c;效率更高&#xff09;&#xff1a;

操作指南 | 如何通过Moonbeam DApp在OpenGov投票

除了Polkassembly或Polkadot.js以外&#xff0c;Moonbeam自己的DApp也可以直接参与链上治理。该界面简洁完整&#xff0c;对用户来说非常方便。 首先进入https://apps.moonbeam.network/moonbeam&#xff0c;连接你的钱包至DApp。Moonbeam DApp支持很多类型的钱包&#xff0c;…

Unity游戏开发中ngui和ugui区别与优缺点详解

Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;…

rust学习特殊的地方——函数返回值

概念 Rust 中的函数定义以 fn 开始&#xff0c;后跟着函数名和一对圆括号。大括号告诉编译器函数体在哪里开始和结束。 特殊的地方——函数返回值 错误的写法 正解1 去掉分号 fn main() {let x plus_one(5);println!("The value of x is: {}", x); }fn plus_…

AI巧破网络诈骗?闭门研讨会报名丨青源Workshop第26期

青源Workshop丨No.26 AI反诈与智能风控&#xff1a;信息安全的矛与盾 AI红利接踵而至&#xff0c;安全风险如影随形。过去几年&#xff0c;人工智能技术的迅速发展催生了包括金融、电子商务、社交网络、医疗保健等众多应用场景。AI应用落地带来新安全风险&#xff0c;安全防护难…

JVS规则引擎及智能BI又更新新功能啦!赶紧来试试

规则引擎更新功能 新增: 1.复合变量新增排序、排名功能 可以按照特定的顺序对数据进行排列&#xff0c;确定规则的优先级&#xff0c;可以提高数据处理效率&#xff0c;帮助分析人员更好地了解数据分布和趋势。 2.决策流新增动态日志功能 动态日志可以记录规则执行的过程和…

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

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

vue实现在页面拖拽放大缩小div并显示鼠标在div的坐标

1、功能要求&#xff1a; 实现在一个指定区域拖拽div,并可以放大缩小&#xff0c;同时显示鼠标在该div里的坐标&#xff0c;如图可示 缩小并拖动 2、实现 <div class"div_content" ref"div_content"><div class"div_image" id"…

药物滥用第二篇介绍

MTD&#xff1a; 美沙酮&#xff08;Methadone&#xff09;&#xff0c;是一种有机化合物&#xff0c;化学式为C21H27NO&#xff0c;为μ阿片受体激动剂&#xff0c;药效与吗啡类似&#xff0c;具有镇痛作用&#xff0c;并可产生呼吸抑制、缩瞳、镇静等作用。与吗啡比较&#x…