【RabbitMq】05 RabbitMq 消息确认机制-可靠抵达

2023-10-27

一、保证消息不丢失
1、使用事务消息,性能下降250倍
2、消息确认机制

1)publisher confirmCallback 确认模式

2)publisher returnCallback 未投递到queue退回模式

3)consumer ack 机制

二、可靠抵达-ConfirmCallback
1、配置

spring.rabbitmq.publisher-confirms=true

2、说明

1)在创建connectionFactory 的时候设置PublisherConfirms(true)选项,开启confirmcallback

  1. CorrelationData: 用来表示当前消息唯一性

3)消息只要被broker接收到就会执行confirmCallback,如果是cluster模式,需要所有broker 接受到才会调用confirmCallback

  1. 被broker 接受到只能表示message 已经到达服务器,并不能保证消息一定会被投递到目标queue里。所以需要用到returnCallback
@Autworied
private RabbitTemplate rabbitTemplate;
/**
* 使用JSON 序列化机制,进行消息转换
*/
@Bean
public MessageConverter messageConverter() {
    return new Jackson2JsonMessageConverter();
}

/**
* 定制RabbitTemplate 
* 1、spring.rabbitmq.publisher-confirms=true
* 2、设置确认回调
*/
@PostConstruct //MyRabbitConfig 对象创建完成以后,执行这个方法
public void initRabiitTemplate() {
    // 设置确认回调
    rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
        /**
        * correlationData  当前消息的唯一关联数据(这个是消息的唯一id)
        * ack 消息是否成功收到
        * cause 失败的原因
        */
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            // 做一些操作
        }
    });
}

三、可靠抵达-ReturnCallback
1、配置

spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true

2、说明

1)confirm 模式只能保证消息到达broker,不能保证消息准确投递到目标queue里。有些业务场景下。我们需要保证消息一定哟啊投递到目标queue里,此时就需要用到return 退回模式

2)如果未能投递目标queue 里将调用returnCallback,可以记录下详细的投递数据,在定期的巡检或者自动纠错使用。

@PostConstruct //MyRabbitConfig 对象创建完成以后,执行这个方法
public void initRabiitTemplate() {
    // 设置确认回调
    rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
        /**
        * 只要消息没有投递给指定的队列,就触发这个失败回调
        * message 投递失败的消息详细信息
        * replayText 回复的状态码
        * replayCode
       * exchange 当这个消息发送给那个交换机
       * routingKey 消息使用的那个routingKey
       */
        @Override
        public void returnMessage(Message message, int replayCode, String replayText, String exchange, String routingKey) {
            // 做一些操作
        }
    });
}

四、可靠抵达-Ack消息确认机制
1、消费者获取到消息,成功处理,可以回复Ack给Broker

  1. basic.ack 用于肯定确认;broker 将移除此消息。

2)basic.nack用于否定确认;可以指定broker是否丢此消息,可以批量

3) basic.dreject 用于否定确认;可以指定broker是否丢此消息,不可以批量

2、默认,消息被消费者收到,就会从broker的queue 中移除

3、queue 五消费者,消息依然会被存粗。但是如果无法确定此消息是否被批处理完成,或者成功处理。我们可以开启手动ack模式

1)消息处理成功,ack(),接受下一个消息,此消息broker就会移除

2)queue 无消费者,默认会手动ack。但是如果无法确定此消息是否被处理完成,或者成功处理。可以启动手动ack模式。
a: 消息处理成功,ack,接受一下这个消息,此消息broker就会移除。
b: 消息处理失败,nack()/reject(),重新发送给其他人进行处理,或者容错处理后ack
c: 消息一直没有调用ack/nack方法,broker 认为此消息正在被处理,不会投递给别人,此时客户端断开,消息不会被broker移除,会投递给别人。

# 手动ack消息
spring.rabbitmq.listener.simple.acknowledge-model=manual

byte[] body = message.getBody();
// 消息头属性信息
MessageProperties properties = message.getMessageProperties();
// 处理消息
...
long deliverTag = message.getMessageProperties().getDeliverTag();
try {
  // 接受消息
  channel.basicAck()    
} catch(Exception e) {
    // 异常处理
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【RabbitMq】05 RabbitMq 消息确认机制-可靠抵达 的相关文章

  • sublime text3 自定义配色方案

    可以实现自定义修改配色方案 生成下载 绝对github上的神器 自定义配色方案 修改保存后 下载后缀为tmTheme的文件 然后打开Sublime Text 点击菜单栏的首选项 gt 浏览插件 此时会弹出一个窗口 路径大概就是 Sublim
  • VS工作目录,输出目录

    默认情况下 输出目录 和 输出文件 两个属性对应的目录是一样的 这样用着方便 当然 输出文件的值在输出目录的值的基础上还包含有exe文件名 如果两个不一样 则中间生成的链接器用的如xx ilk和xx pdb文件等在输出目录 而最终生成的xx
  • C语言 分支与循环语句 上

    3 5 表达式语句 printf hehe n 函数调用语句 空语句 有时候我们需要一条语句 但是这条语句什么都不需要做 叫做空语句 return 0 分号隔开的是一条语句 用一条语句加一个分号 控制语句用于控制程序的执行流程 以实现程序的
  • Windows 10 中的 BitLocker问题

    最近安装双系统 遇到了BitLocker的问题 被windows狠狠地恶心了一把 这里记录下来 后面的兄弟们不要躺坑 1 BitLocker是什么东西 就是这个界面 首先 这里有微软官方的解释 链接 总结来说就是一种加密方式 实质上个人理解
  • Angular4对cookie的操作

    cookie详细方法及使用 time number 2 60 60 1000 cookie过期时间两个小时 2 60 60 1000 储存cookie this cookieService set userId this userId ne
  • 【大数据】HiveQL:视图

    HiveQL 视图 视图可以允许保存一个查询 并向对待表一样对这个查询进行操作 这是一个逻辑结构 因为它不像一个表会存储数据 换句话说 Hive 目前暂不支持物化视图 当一个查询引用一个视图时 这个视图所定义的查询语句将和用户的查询语句组合
  • 首次域名注册

    什么是域名 域名是Internet网络上的一个服务器或一个网络系统的名字 在全世界 没有重复的域名 域名的形式是以若干个英文字母或数字组成 由 分隔成几部分 如 56dr cn 就是一个域名 域名与网址有什么区别 一个完整网址范例如下 ht
  • 如何评价代码的好坏?

    我们一般从可维护性 可读性 可扩展性 可测试性 可复用性 简洁性来评价代码的质量 可维护性 所谓维护无外乎就是修改bug 修改老的代码 添加新的代码之类的工作 代码易维护指的是在不破坏原有代码设计 不引入新的bug的前提下 能够快速的修改或
  • python基础(5):深入理解 python 中的赋值、引用、拷贝、作用域

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在 python 中赋值语句总是建立对象的引用值 而不是复制对象 因此 python 变量更像是指针 而不是数据存储区域 这点和大多数 OO 语言类似吧 比如 C java
  • JAVA基础学习笔记1

    教程来源 https www runoob com java java tutorial html 以下是个人学习笔记 用水平线划分小节 我的第一个JAVA程序 通常都写成这样 public class HelloWorld public
  • Spring Boot -01- 快速入门篇(详解图文教程)

    作者 肖朋伟 来源 https blog csdn net qq 40147863 article details 84194493 Spring Boot 01 快速入门篇 图文教程 今天开始不断整理 Spring Boot 2 0 版本
  • Windows安装Ubuntu双系统(Win11+最新Ubuntu22.04.1LTS)

    目录 前言 一 查看基础环境 二 准备安装文件 1 下载Ubuntu 22 04 01 LTS镜像ISO文件 2 下载官方推荐的U盘启动制作工具 3 制作启动U盘 4 新建硬盘分区用来安装Ubuntu系统 5 BIOS设置 三 安装Ubun
  • stata学习笔记①stata基础介绍

    文章目录 一 为什么要学stata 二 软件基本解释 1 软件界面 2 导入示例数据 3 认识几个重要的功能符号 三 数据的基本观测 四 统计性描述 1 codebook 数据字典使用 2 summarize 五 图像初步探索 1 hist
  • 华硕服务器RS720-E10-RS12无法安装win10到M.2的NVME SSD

    进BIOS开启CSM 兼容性支持模块
  • 区块链浏览器与合约代码

    声明 此文系 Vue3 0 Quasar ethers js 和以太坊智能合约交互 系列教程之一 开始 区块链浏览器 在本教程中 我一直在说区块链是去中心化的 它想打造的是一个数据永不可篡改且公开透明的数据世界 那么这样的区块链它最重要的一
  • linemod算法过程理解

    一 提取模板 1 预处理 使用高斯模糊预处理将要作为模板的RGB图 2 模板梯度计算 分别计算RGB三个通道中每个像素点x和y方向的梯度 sobel算子 取幅值最大的作为该像素的梯度 若梯度幅度值小于阈值 则被舍弃 3 梯度离散化及量化 对
  • 01 逻辑回归的理解

    1简介 逻辑回归是一个分类算法 本质是对线性回归做了一个变换 将值域压在0 1的空间 从而可以未每一个特征 估算出一个概率 作预测问题 二分类 逻辑回归问题 本质上就变成 求解变换后的每个特征的权重 ax1 bx2 cx3 0 1 求解模型
  • STM32的PWM和DAC练习

    文章目录 一 输出PWM波形 1 1 实验代码 1 2 调试 一 输出PWM波形 1 1 实验代码 代码来自野火STM32F103 mini开发板资料 1 书籍配套例程 F103RCMINI 32 TIM 高级定时器 3 TIM 高级定时器
  • 【牛客】HJ1 字符串最后一个单词的长度

    三行代码做一道题HJ1 字符串最后一个单词的长度 我的意思是不包括固定代码哦 读题 输出几个单词 以空格隔开 输出最后一个单词的长度 代码 直接写最终解题代码 include

随机推荐

  • vue路由传参的两种方式,实现返回上个页面不刷新

    我的项目是当在新增页面 下面叫A页面 先提交一些数据 然后跳转到下一个页面 下面叫B页面 再填写数据 然后返回到新增的页面 之前我直接跳转回B页面goback 这样的话跳转回来A页面就什么数据都没有了 解决方法有两种 一种是在地址栏里面拿参
  • 最简单自动化搜索的脚本代码

    from selenium import webdriver from selenium webdriver common by import By driver webdriver Chrome 打开的网址一般是get请求 driver
  • C语言学习记录——项目1 交换机后台管理之登录菜单(1)

    C语言学习记录 项目1 交换机后台管理之登录菜单 1 交换机 交换机 Switch 是一种用于电 光 信号转发的网络设备 它可以为接入交换机的任意两个网络节点提供独享的电信号通路 最常见的交换机是以太网交换机 其他常见的还有电话语音交换机
  • mysql 查询出表字段的属性

    SELECT column name 字段名 column comment 字段说明 column type 字段类型 column key 约束 FROM information schema COLUMNS WHERE table na
  • Node.js 基础篇(九):fs.watchFile

    目录 fs watch 监视 filename 的变化 fs watchFile 监视 filename 的变化 fs watch 监视 filename 的变化 fs watch filename options listener fil
  • 机器学习:matlab和python实现SVD(奇异值分解)算法

    1 SVD SVD Singular Value Decomposition 奇异值分解 SVD算法不光可以用于降维算法中的特征分解 还可以用于推荐系统 以及自然语言处理等领域 是很多机器学习算法的基石 假设我们现在有一个矩阵M m n 如
  • 服务器上R调用png显示x11报错怎么办?

    太长不读版 治本的方法 服务器安装pango 之后重新编译R语言 治标的方法 在R的配置文件中增加options bitmapType cairo 服务器上装完R语言之后 发现自己的PNG函数无法正常调用 始终会出现一个X11连接失败的错误
  • 进行模拟点击的时候,利用python完成黑名单和白名单(判断字符串是否包含)

    在做项目的时候 遇到一个需求 就是在进行模拟点击的时候 要求加上一个黑名单和白名单 意思就是 白名单 模拟点击的时候 不能点击白名单里面有的元素 例如 包含什么地址 或者什么数字和特殊的字符串的时候 黑名单 就是不在黑名单里的元素 就不能进
  • 中台到底在共享什么

    一 中台的诞生 中台战略是企业数字化转型过程中的一个热门话题 说到中台转型 企业大多对标阿里巴巴 2015年阿里巴巴提出了 大中台 小前台 的中台战略 提出之初阿里有近 4 亿用户 为超过 1000万各类企业提供服务 业务种类繁多 业务之间
  • @DynamicUpdate 注解 动态更新 和 lombok 插件 @Data 注解使用 ; @Transient 与Dto引入

    比如在实体类中 private Date updateTime 这个属性 在数据库中 我们创建update Time的时候我们 update Time timestamp not null default current timestamp
  • [C++]何为溢出?如何避免?

    总时忘记 以Leetcode69为例 来记录一下吧 给你一个非负整数 x 计算并返回 x 的 算术平方根 由于返回类型是整数 结果只保留 整数部分 小数部分将被 舍去 注意 不允许使用任何内置指数函数和算符 例如 pow x 0 5 或者
  • 惊!一百多万人下载这些vscode摸鱼插件

    分享资料 一起学习 我是小白 微信 tlxx233 备注 888建了个微信程序员学习群 互相解答问题 有需要的同学可以加我微信进群 作为一个程序员 我们的日常工作离不开代码编辑器 有时候编写代码会让人感到无聊和单调 但是好的插件可以让编码变
  • 这个牛逼的Python模块,能让你轻松模拟并记录键盘操作(附零基础学习资料)

    前言 模拟键盘操作执行自动化任务 我们常用的有 pyautowin 等自动化操作模块 但是这些模块有一个很大的缺点 编译的时候非常依赖 windows 的C语言底层模块 文末送福利 今天介绍的这个模块叫做 keyboard 它有一个最大的优
  • SaltStack部署

    目录 一 SaltStack简介 1 基本简介 2 通信方式 3 功能简介 二 资源获取 1 官网地址 2 阿里云地址 三 部署 1 配置环境说明 2 资源配置 一 SaltStack简介 1 基本简介 SaltStack是一种新型的基础设
  • IDEA 如何根据代码自动生成类图

    文件夹右键 gt Diagrams gt show Diagram gt Java classes diagram 选择类图的成员 成员变量 构造器 方法 配置文件 内部类 生成的类图
  • 读书感悟之,从术到道

    最近在看了一些书 因为书的内容和方向有着比较大的出入 自然就有了一些不同层面的感悟 在笔者看来 书籍大抵成三类 层面 1 术的层面 1 科普和不系统的知识类 如 电气知识1000问 各种论坛 帖子 公众号的非连载的知识类 人文社科的更多 这
  • visio绘制自制图案并填充

    1 首先打开 文件 gt gt 选项 gt gt 高级 勾选以开发人员模式运行 2 选择开发工具 选择线条 3 绘画出椭圆与线条 4 选择操作 使用修剪功能或得相交得两个部分 5 按照上述步骤绘制出想要得图案 全选后选择操作中的连接 6 对
  • 尝试在条件“($(MsBuildMajorVersion) < 16)”中对计算结果为“”而不是数字的“$(MsBuildMajorVersion)”进行数值比较

    https learn microsoft com en us nuget consume packages migrate packages config to package reference 我的处理方法简单粗爆 直接将packag
  • mysql映射表的作用_php – MySQL:了解映射表

    当使用多对多关系时 处理此事的唯一现实的方法是使用映射表 说我们有一所有老师和学生的学校 一个学生可以有多个教师 反之亦然 所以我们做3个表 student id unsigned integer auto increment primar
  • 【RabbitMq】05 RabbitMq 消息确认机制-可靠抵达

    一 保证消息不丢失 1 使用事务消息 性能下降250倍 2 消息确认机制 1 publisher confirmCallback 确认模式 2 publisher returnCallback 未投递到queue退回模式 3 consume