rabbitmq消息队列 ack机制(消息确认机制)和消息补偿机制
参考:https://blog.csdn.net/pan_junbiao/article/details/112956537
ack 机制就是消息在 生产者在发布消息以后,消息存在内存中,如果消息被确认就会删除内存中消息。
在rabbitMq中 设置2种消息确认模式
1:自动确认 :RabbitMq种默认的确认模式 自动确认模式下,当 Broker (消息队列服务器实体)成功发送消息给消费者后就会立即把此消息从队列中删除,而不用 等待消费者回送确认消息。
2:手动确认。而在手动确认模式下,当 Broker (消息队列服务器实体) 发送消息给消费者后并不会立即把 此消息删除, 而是要等收到消费者回送的确认消息后才会删除,因此当消费者收到消息已经会发送一个ACK命令指消息确认给发送者,如果消费者因为意外崩溃而没有 发送 ACK 指令, 那么 Broker (消息队列服务器实体) 就会把该消息转发给其他消费者(如果此时没有其他消费者,则 Broker(消息队列服务器实体) 会缓存此消息, 直到有新的消费者注册)。
消息确认模式的实现实际上就是为了保险起见,在消息错误的时候做出一些处理。
消息确认可以在,提供了2个接口,一个在交换机回调,一个在发送到路由的时候回调
继承的接口 confirmCallBack ,returnCallBack 实现的方法 就是confirm和 returnMessage 2个方法
实现如图
/*** 生产者 发送到exchange后,回调* @param correlationData 消息相关的数据,一般用于获取 唯一标识 id* @param ack true 消息确认成功,false 失败* @param cause 确认失败的原因*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {log.info("---confirm---ack={}, cause={}", ack, cause);log.info("correlationData-->{}", correlationData.toString());if (ack) {log.info("confirm消息确认成功");} else {
/*** 生产者 找不到路由,触发* @param message 消息的相关信息* @param replyCode 错误状态码* @param replyText 错误状态码对应的文本信息* @param exchange 交换机的名字* @param routingKey 路由的key*/@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.info("---returnedMessage---replyCode={}, replyText={}, exchange={}, routingKey={}", replyCode, replyText, exchange, routingKey);}
rabbitmq消息队列 ack机制(消息确认机制)和消息补偿机制相关推荐
- 消息队列mysql redis那个好_Redis作为消息队列与RabbitMQ的比较
Redis作为消息队列与RabbitMQ的比较 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩 ...
- msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列
Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...
- 手把手教姐姐写消息队列(golang)- 使用channel实现消息队列
前言 这周姐姐入职了新公司,老板想探探他的底,看了一眼他的简历,呦呵,精通kafka,这小姑娘有两下子,既然这样,那你写一个消息队列吧.因为要用go语言写,这可给姐姐愁坏了.赶紧来求助我,我这么坚贞不 ...
- redis延迟消息队列不准时php,Redis实现延迟消息队列
消息队列是应用中常用的一个技术点,通常我们可以借助消息队列中间件来实现,但是并不是所有的情况下,都需要使用到MQ. 如果只需要实现简单的消息队列,那么借助Redis即可. 如果对消息有着严格的可靠性等 ...
- RTX5 | 消息队列05 - 获取剩余空间,清空消息队列,删除消息队列
文章目录 一.前言 二.实验目的 三.API 3.1.osMessageQueueGetSpace 3.2.osMessageQueueReset 3.3.osMessageQueueDelete 四 ...
- java消息队列mq_我爱java系列---【消息队列(rabbitmq)】
使用消息队列来避免分布式事务 如果仔细观察生活的话,生活的很多场景已经给了我们提示. 比如在北京很有名的姚记炒肝点了炒肝并付了钱后,他们并不会直接把你点的炒肝给你,往往是给你一张小票,然后让你拿着小票 ...
- 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...
大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...
- 消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?大量消息持续积压几个小时,怎么办?...
消息积压处理办法1:临时紧急扩容 先修复consumer的问题,确保其恢复消费速度,然后将现有consumer都停掉.新建一个topic,partition是原来的10倍,临时建立好原先10倍的que ...
- 消息队列(2):常见的消息队列协议
协议很常见,只要是通信,就会用到协议,就像我们说话的语言一样,不同的语言连通着不同的人群. 所以说,消息队列也是一样,想要互相通信,就要使用同一种协议. 每个协议下的消息队列,都有着不同的角色定义. ...
最新文章
- TensorRT Analysis Report分析报告
- python threading模块多线程源码示例(一)
- vs2008格式化代码
- 在Mac OS X中配置Apache + PHP + MySQL
- vue.js安装问题
- 洛谷P1337 [JSOI2004]平衡点 / 吊打XXX(模拟退火)
- 【Python】Python字典的高级用法-统计计数
- jboss配置ejb容器_JBoss AS 7 EJB3池配置
- Python之turtle画小狗、狮子头和小黄人
- 地震时,它可以救你一命!
- VS连接SQL ,Windows登录SQL 语句
- <<道 德 经>>------老子
- word文档怎么转换成jpg格式图片
- matlab interp1 spline,中国大学MOOC: MATLAB/Octave函数interp1中有一个描述插值方法的参数,其中spline表示...
- 星星之火OIer:C++大纲
- 使用win7自带的备份还原、创建系统镜像
- 关机、睡眠和休眠有啥区别
- (转) 行人检测资源 综述文献
- 没有专业技能不要紧,通过快营通也能月入上千元
- mysql运行sql文件不成功,圆我大厂梦!