Rabbitmq 消息可靠性保证

news2024/11/20 10:45:52
1、简介

        消息的可靠性投递就是要保证消息投递过程中每一个环节都要成功,本文详细介绍两个环节的消息可靠性传递方式:1)、消息传递到交换机的 confirm 模式;2)、消息传递到队列的 Return 模式。

消息从 producer 到 exchange 则会返回一个 confirmCallback;

 消息从 exchange 到 queue 投递失败则会返回一个 returnCallback;

2、Confirm模式

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

2.1、使用confirm模式的具体步骤

1)、配置文件application.yml 开启确认模式

spring:
  rabbitmq:
    host: 192.168.30.88
    port: 5672
    username: admin
    password: admin
    virtual-host: test
    publisher-confirm-type: correlated   # 开启数据关联确认机制

2)、组件绑定关系配置(采用直连交换机模式)

@SpringBootConfiguration
@ConfigurationProperties(prefix = "rabbit.confirm")
public class RabbitConfigCommit {
    private String exchangeName;
    private String queueName;
    @Bean
    public DirectExchange directExchange(){
        return ExchangeBuilder.directExchange(exchangeName).build();
    }
    @Bean
    public Queue queue(){
        return QueueBuilder.durable(queueName).build();
    }
    public Binding bindingA(DirectExchange exchange, Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("info");
    }
}

3)、写一个类实现implements RabbitTemplate.ConfirmCallback,判断成功和失败的ack结果,可以根据具体的结果,如果ack为false,对消息进行重新发送记录日志等处理;设置rabbitTemplate的确认回调方法rabbitTemplate.setConfirmCallback(messageConfirmCallBack);

@Service
public class MessageServiceConfirm implements RabbitTemplate.ConfirmCallback {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
    }
    public void sendMsg(){
        Message message = MessageBuilder.withBody("hello long".getBytes()).build();
        // 设置消息关联数据
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId("123");
        rabbitTemplate.convertAndSend("exchange.confirm", "info", message, correlationData);
    }
// 消息确认返回判断
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        if (b){
            System.out.println("消息发送到交换机成功!" + correlationData.getId());
            return;
        }
        System.out.println("消息发送到交换机失败!" + correlationData.getId());
    }
}
3、Return 模式
3.1、使用 retrun 模式的具体步骤(和confirm 模式一致)

1)、配置文件application.yml 开启 retrun 模式

spring:
  rabbitmq:
    host: 192.168.30.88
    port: 5672
    username: admin
    password: admin
    virtual-host: test
    publisher-confirm-type: correlated
    publisher-returns: true  # 开启Return模式

2)、组件配置(参考confirm模式)

3)、使用rabbitTemplate.setReturnCallback设置退回函数,当消息从 exchange 路由到 queue 失败后,则会将消息退回给producer,并执行回调函数 returnedMessage(采用匿名内部类/lambda表达式实现)

@Service
public class MessageServiceReturn {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @PostConstruct
    public void init(){
        // 不使用匿名内部类,就要实现接口 implements RabbitTemplate.ReturnsCallback
        rabbitTemplate.setReturnsCallback(msg -> {
            System.out.println("消息发送结果:" + msg.getReplyText());
        });
//        rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback(){
//            @Override
//            public void returnedMessage(ReturnedMessage returnedMessage) {
//                System.out.println("消息发送结果:" + returnedMessage.getReplyText());
//            }
//        });
    }
    public void sendMsg(){
        Message message = MessageBuilder.withBody("hello long".getBytes()).build();
        rabbitTemplate.convertAndSend("exchange.return", "info", message, correlationData);
    }
}
4、总结

        本文详细介绍两种模式的消息可靠性保证,关于Rabbitmq 消息持久化、集群配置等更高级的内容关注下面公众号查阅。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

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

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

相关文章

智能化输电线路定位技术:提升电网运行效率的未来发展方向

随着科技的不断发展,电力行业也在逐步引入智能化技术,以提高输电线路的运行效率和安全性。在这篇文章中,恒峰智慧科技将探讨一种新的输电线路定位技术——分布式行波测量技术,它如何帮助我们实现这一目标。 一、分布式故障定位及隐…

STM32-创建工程模板

STM32 工程模板没有统一的格式,可以参考 ST 官方的示例模板或者根据自己的开发经验和使用习惯总结。 Project Template 文档以库函数工程模板为例,HAL 库工程模板对应参考即可。 Official Project Template ST 发布的标准外设库 (STM32 Standard Per…

docker搭建部署mysql并挂载指定目录

Docker是一种轻量级、可移植的容器化平台,可以简化应用程序的部署和管理。在本文中,我们将探讨如何使用Docker来搭建和部署MySQL数据库,并将数据和配置文件挂载到外部目录,以实现数据持久化和方便的配置管理。 1: 安装Docker 首…

git撤销提交到本地的commit

有些时候,当我们提交代码到本地后,突然发现因为某些原因需要撤销提交本地的代码。 就比如我,因为代码写错了分支,已经提交到本地了,而我需要取消,并且还要把代码搞得另外的分支上。 提交前: …

MIB 变更周期

MIB 始终以 80 ms 的周期在 BCH 上传输并在 80 ms 内重复,并且它包括从小区获取 SIB1 所需的参数;如果 SSB 的周期大于 80 ms,则 MIB 的发送周期与 SSB 的周期相同。 在UE初始搜索时,SSB在半帧内的周期是20ms;所以对于…

Embedded-Project项目介绍

Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址: https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…

锂电池制造设备中分布式IO模块优势

在“碳达峰、碳中和”目标推动下,新能源汽车当下发展势头正盛,而纯电动车的核心部件则是:锂电池。动力型锂电池作为新能源汽车核心零部件,其发展与新能源汽车行业息息相关,迎来广阔的市场空间。 为何采用I/O模块&#…

网络安全B模块(笔记详解)- 漏洞扫描与利用

漏洞扫描与利用 1.通过Kali对服务器场景server2003以半开放式不进行ping的扫描方式并配合a,要求扫描信息输出格式为xml文件格式,从生成扫描结果获取局域网(例如172.16.101.0/24)中存活靶机,以xml格式向指定文件输出信息(使用工具Nmap,使用必须要使用的参数),并将该操…

信息系统安全——基于 AFL 的模糊测试

实验 3 基于 AFL 的模糊测试 3.1 实验名称 《基于 AFL 的模糊测试》 3.2 实验目 1 、熟悉模糊测试方法 2 、熟悉模糊测试工具 AFL 的使用 3.3 实验步骤及内容 1 、 安装 AFL 2 、 任意选择一个有源代码的样本 这里采用教材上一个包含栈溢出漏洞的样本。 3 、 结合源代码分析用 …

Yolov5双目测距-双目相机计数及测距教程(含代码)

Yolov5双目测距是一种基于深度学习模型的双目相机计数及测距方法,它可以用于在不同场景下进行物体检测、识别和测距。 以下是 Yolov5双目测距的主要特点和步骤: 1. 双目相机: Yolov5双目测距需要使用一对双目相机来获取场景中的图像数据。…

vercel部署twikoo后评论收不到通知邮件问题解决方法

📌 前言:本文主要是总结一下在vercel部署twikoo后收不到评论邮件通知问题的解决方法,本人在各种查资料无果后最终去twioo的git官方项目的issue中找到某位大佬给出的原因以及解决方案,故做此记录,希望对遇到此问题的同学…

74应急响应-winlinux分析后门勒索病毒攻击

#操作系统(windows,linux)应急响应: 1.常见危害:暴力破解,漏洞利用,流量攻击,木马控制(Webshell,PC 木马等),病毒感染(挖矿,蠕虫,勒索等)。 2.常见分析:计算机账户&…

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升,数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域,Navicat 16 for MySQL作为一款强大的数据库开发管理工具,正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

D55XT80-ASEMI配电箱整流桥D55XT80

编辑:ll D55XT80-ASEMI配电箱整流桥D55XT80 型号:D55XT80 品牌:ASEMI 封装:DXT-4 特性:插件、整流桥 平均正向整流电流(Id):55A 最大反向击穿电压(VRM&#xff09…

nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施

目录 前言: 一.龙蜥(Anolis)操作系统上安装GCC 1.安装gcc 2.检验安装 二.安装出现 make: *** 没有规则可以创建“default”需要的目标“build” 问题 1.解压安装nginx 2.安装出现问题展示 3.解决措施 4.重新编译进行安装 5…

2024 年 API 管理新趋势预测

本文译自:What Will Be the API Management Trends for 2024? 原文链接:What Will Be the API Management Trends for 2024? - The New Stack 原文作者:Kenn Hussey 预计到 2030 年末,API 管理 市场的规模将增长六倍&…

理论U3 决策树

文章目录 一、决策树算法1、基本思想2、构成1)节点3)有向边/分支 3、分类步骤1)第1步-决策树生成/学习、训练2)第2步-分类/测试 4、算法关键 二、信息论基础1、概念2、信息量3、信息熵: 二、ID3 (Iterative Dichotomis…

基于JavaWeb+BS架构+SpringBoot+Vue+Spark的共享单车数据存储系统的设计和实现

基于JavaWebBS架构SpringBootVueSpark的共享单车数据存储系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 第一章 概述 2 1.1课题研究背景 2 1.2 课题研究意义 2 1.3国内…

wy的leetcode刷题记录_Day74

wy的leetcode刷题记录_Day74 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-01-10 前言 目录 wy的leetcode刷题记录_Day74声明前言2696. 删除子串后的字符串最小长度题目介绍思路代码收获 64. 最小路径和题目介绍思路代码收获 63.…

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…