Rabbitmq 消息可靠性保证

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自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN跨境专线:优化企业网络效率与安全性

企业网络通信的革新已经成为跨境业务发展中的重要一环。新加坡作为国际商业中心,吸引着众多企业在此开设分支机构。然而,传统的跨境网络连接方式常常存在着诸多问题,例如网络延迟高、丢包率大等。在这些挑战面前,SD-WAN&#xff0…

【leetcode】力扣算法之两数相加【中等难度】

题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都…

助力企业出海,Ogcloud提供一站式网络解决方案

随着全球市场的开放和跨境电商的蓬勃发展,越来越多企业开始在海外拓展业务。但在这过程中,各种各样的网络问题成为企业出海的阻碍。Ogcloud凭借其卓越的技术实力和丰富的经验,为全球业务的公司提供全面的网络解决方案,包括SD-WAN、…

C语言如何提高程序的可读性?

一、问题 可读性是评价程序质量的一个重要标准,直接影响到程序的修改和后期维护,那么如何提高程序的可读性呢? 二、解答 提高程序可读性可以从以下几方面来进行。 (1)C程序整体由函数构成的。 程序中,main()就是其中…

C#,数值计算,高斯消元法与列主元消元法的源代码及数据动态可视化

高斯消元法! 一、高斯消元法 Gaussian Elimination 高斯消元法(或译:高斯消去法),是线性代数中的一个常用算法,常用于求解线性方程组和矩阵的逆。 本程序的运行效果: 1、高斯消元法的动画演示…

Linux学习19 在Ubuntu命令行下使用新硬盘

Linux学习19 在Ubuntu命令行下使用新硬盘 一、准备环境二、检测硬盘三、对新硬盘格式化1. 创建分区2. 格式化 三、挂载操作1. 创建挂载点2. 挂载硬盘3. 验证挂载 四、实现永久挂载(可选)1. 文件结构与内容:2. /etc/fstab 的重要性与作用3. 修…

运算符详解

1、定义 定义:运算符是一种特殊的符号,用于表示数据的运算、赋值和比较等 运算符的分类 1)按功能分类: 1)算术运算符(7个)​​​​​​​ 、-、*、/、%、、--​​​​​​​ 2&#xff0…

自动化测试框架pytest系列之基础概念介绍(一)

如果你要打算学习自动化测试 ,无论是web自动化、app自动化还是接口自动化 ,在学习的道路上,你几乎会遇到pytest这个测试框架,因为自动化编写没有测试框架,根本玩不了 。 如果你已经是一位自动化测试人员 ,…

工程监测领域振弦采集仪的数据处理与分析方法探讨

工程监测领域振弦采集仪的数据处理与分析方法探讨 在工程监测领域,振弦采集仪是常用的一种设备,用于测量和记录结构物的振动数据。数据处理和分析是使用振弦采集仪得到的数据的重要环节,可以帮助工程师了解结构物的振动特性,评估…

FRPS配置服务端(腾讯云)、客户端(PC电脑Windows、树莓派Debian)并设置虚拟域名

1.服务端(腾讯云):frps.ini [common] bind_port 7000 vhost_http_port8080 vhost_https_port44344 dashboard_port 7500 privilege_token your_password subdomain_host example.com use_encryption true encryption_method tls dashb…

面试宝典进阶之关系型数据库面试题

D1、【初级】你都使用过哪些数据库? (1)MySQL:开源数据库,被Oracle公司收购 (2)Oracle:Oracle公司 (3)SQL Server:微软公司 (4&#…

RabbitMQ发布确认

1.单个确认 单个确认发布是一种同步确认发布方式,也就是发布一个消息后只有它被确认发布,后续的消息才能继续发布。 缺点:发布速度特别慢,因为若是没有确认发布的消息会阻塞所有后续消息的发布 package com.hong.rabbitmq5;import com.hong.utils.Rabb…

微信Windows版如何从旧电脑迁移聊天记录到新电脑

我们都知道,换手机的话,如果是同品牌,可以用该品牌的换机助手将微信资料传输给新手机,或者用微信PC端的迁移与备份功能来实现 那么换电脑或者重装系统呢?我们可以通过转移文件夹的方式进行 1、登录PC微信,…

选择最适合您的10个在线PS类型工具

Adobe Photoshop 多年来,Photoshop一直是设计师的首选。PS的功能无疑是非常强大的。设计师可以使用它来制作从简单的网页到复杂的移动应用程序设计。学习PS的基本知识很容易,但学习PS的所有技能都需要大量的时间和精力。当然,您也可以选择体…

哈希表-散列表数据结构

1、什么是哈希表? 哈希表也叫散列表,哈希表是根据关键码值(key value)来直接访问的一种数据结构,也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度,这种映射关系称之为哈希函数或者散列函数&…

环境变量的使用

1.用法 1.建立文件夹.env.production(开发).env.development(生产) 代码: NODE_ENVdevelopment VUE_APP_BASE_APIwww.aaa.comNODE_ENVproduction VUE_APP_BASE_APIwww.xxx.com 注意: 环境变量的文件夹应该是和src目录同级的: 2.获取 process.env.V…

vue+springboot+mybatis-plus实现乡村公共文化服务系统

项目前端:https://gitee.com/anxin-personal-project/rural-public-cultural-services-front 项目后端:https://gitee.com/anxin-personal-project/rural-public-cultural-services-behind 1.系统简介 乡村公共服务文化提供给管理员、商家、村民。管理…

二次电池的自放电

一、自放电概念 电池在开路状态时,其存储的电量自发被消耗的现象称为电池的自放电,又称电池的荷电保持能力,即在一定环境条件下,电池储存电量的保持能力。自放电也是衡量电池性能的重要参数之一,不同类型的电池自放电因…

过节购物怎么划算?用C语言爬虫采集京东优惠券

年关将至,喜迎春节,各家各户都忙着置办年货,农村逛集市,而城市里面的,尤其是年轻人最喜欢的是网购了,网购产品种类多,齐全非常方便。今天我就利用我学的技能,帮助大家爬取京东优惠券…

学生如何正确使用台灯?精选最合适学生使用的台灯

如今我国青少年儿童的近视率非常高,已经超过了50%,并且这个近视率还在逐年上升,近视的年龄也越来越趋势于低龄化,不少还未上学或者正在上小学的孩子都早早戴上了近视眼镜。因此许多家长都纷纷给孩子选购一台专业的护眼台灯&#x…