RabbitMQ学习第七章:消息确认机制之事务机制
RabbitMQ消息确认机制之事务机制。
RabbitMQ中,我们可以通过持久化数据 解决RabbitMQ服务器异常
的数据丢失问题。
问题:生产者将消息发送出去,消息到底有没有到达RabbitMQ服务器
默认的情况下是不知道的。
两种方式:
1.AMQP实现了事务机制,类似mysql的事务。
事务机制三个方法:
txSelect:用于将当前changel设置成transation模式。
txCommit:用于提交事务。
txRollback:回滚事务。
通过txSelect开启事务后,便可以发送消息给RabbitMQ服务器,通过
txCommit提交成功,如果提交之前出现了异常,就txRollback回滚。
问题:开启-提交-回滚,每次提交,都相当于一次请求,降低了消息的吞吐量,
因为走的通信太多,大量消息就会大量请求服务器,很耗时。
例:
生产者

消费者:

图中发送消息逻辑没有问题,所以发送的消息会成功


如果生产者代码中执行了错误的逻辑,比如:

这时候再发送消息,就会失败,并回滚。


2.confirm模式。
生产者端confirm实现原理:生产者将信道设成confirm模式,一旦信道进入到
confirm模式,所有在该信道发布的消息都会指派一个唯一消息id,一旦消息被投
递到所匹配的队列之后,就会发送一个确认给生产者(包含消息id),
这就使得生产者知道了这个消息已经正确到达了队列。如果消息和队列是可持久
化的,确认消息会将消息写到磁盘后在发出。
Confirm模式最大的好处在于它是异步的。
开启confirm模式:channel.confirmSelect();
编程模式:
2.1.普通:发过去(一条)后会调用waitForConfirms()(串行)。
2.2.批量:发过去(一批)后会调用waitForConfirms()(串行)。
2.3.异步confirm:提供一个回调方法,服务端confirm一条或多条后客户端会调用。
例:
Confirm普通模式 生产者:


消费者:


Confirm批量模式(普通模式+for循环) 生产者:

消费者:

confirm模式-异步
channel对象提供的confirmListener()回调方法只包含deliveryTag(当前channel发出
的消息序号),我们需要自己为每一个channel维护一个unconfirm的消息序号集合,
每publish一条数据,集合中元素加1,每回调一次handleAck方法,unconfirm集
合删掉相应的一条(multiple=false)或多条(multiple=true)记录,从程序运行效
率上看,这个unconfirm集合最好采用有序集合SortedSed存储结构
RabbitMQ学习第七章:消息确认机制之事务机制的更多相关文章
- SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)
目录 说明 生产端 消费端 说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同 ...
- 消息队列RabbitMQ(三):消息确认机制
引言 RabbitMQ的模型是生产者发送信息到 Broker (代理),消费者从 Broker 中取出信息.但是生产者怎么知道消息是否真的发送到 Broker 中了呢?Broker 又怎么知道消息到底 ...
- rabbitmq学习(七) —— springboot下的可靠使用
前面的学习都是基于原生的api,下面我们使用spingboot来整合rabbitmq springboot对rabbitmq提供了友好支持,极大的简化了开发流程 引入maven <depende ...
- Java基础知识二次学习--第七章 容器
第七章 容器 时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...
- C#高级编程 (第六版) 学习 第七章:委托和事件
第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...
- MQ确认机制之事务机制------tx
一:介绍 1.介绍 在前面的说的模式中会出现一个问题. 就是生产者将消息发送出去到底有没有到达rabbitMq,默认情况下是不知道. 有两种解决方式. AMQP实现事务机制 Confirm机制. 这里 ...
- JMS 基本可靠性机制 和 事务机制
4.3.1 基本可靠性机制4.3.1.1 控制消息的签收(Acknowledgment) 客户端成功接收一条消息的标志是这条消息被签收.成功接收一条消息一般包括如 下三个阶段:1.客户端接收消息:2. ...
- rabbitmq for C#的异步消息确认机制
代码: using (var conn = RabbitmqHelper.GetConnection()) { using (var channel = conn.CreateModel()) { / ...
- RabbitMQ学习笔记2-理解消息通信
消息包含两部分:1.有效载荷(payload) - 你想要传输的数据.2.标签(lable) - 描述有效载荷的相关信息,包含具体的交换器.消息的接受兴趣方等. rabbitmq的基础流程如下: Ra ...
- rabbitMQ学习笔记(七) RPC 远程过程调用
关于RPC的介绍请参考百度百科里的关于RPC的介绍:http://baike.baidu.com/view/32726.htm#sub32726 现在来看看Rabbitmq中RPC吧!RPC的工作示意 ...
随机推荐
- 统计tomcat的access日志
统计tomcat的access日志的ip次数,并按次数排序 awk '{sum[$1]++}END{for(i in sum) print i "\t" sum[i]}' loca ...
- LP1-5:测试设计
在接到产品需求进行开发前,怎么样才能最大程度的降低开发错误或明显bug的情况? 答案是在「开发前做设计」. 通常,一个功能的设计要包含几个方面: 1.已有功能情况 2.需求情况 3.数据库设计 4.接 ...
- 使用PHP自带的过滤验证函数:Filter
在PHP开发中,大家经常会对提交的表单数据做合法性验证,比如验证Email/IP/URL,大家首先想到的应该是使用正则验证.其实在PHP中已经内置了一个过滤验证函数Filter,大家可以参考一下. P ...
- vue3中reactive数据被重新赋值后无法双向绑定,使用reactive包裹数组如何正确赋值?
需求:将接口请求到的列表数据赋值给响应数据arr const arr = reactive([]); const load = () => { const res = [2, 3, 4, 5]; ...
- Cannot read property 'xxxx' of null
在使用的vue3+element-plus的项目中,我使用了form表单对数据进行校验. 但是使用了: refDom.value.validate((valid) => {}) 后,过一会控制台 ...
- 压力&负载理论
一.定义: 1.压力测试 是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向 ...
- winform 子控件触发父控件事件
private void circlePanel_Click(object sender, EventArgs e) { var panel=sender as UIPanel; if (panel. ...
- C# 读取串口设备列表
ManagementObjectSearcher 解析不到头文件,需要手动 Add Referance 需要添加引用:System.Management,然后引入命名空间:using System.M ...
- Windows下更改MySQL数据库的存储位置(10为例子)
有时候,自己安装MySQL的时候都是默然安装路径的,MySQL安装时不能选择数据库文件的安装位置,也没有可用的直接更改数据库目录的工具.之后所新建的数据库默认存储在C盘,当然了C盘很重要什么东西都存过 ...
- 遇到端口占用无法启动IIS Express服务器
报错图片: 上图所述由于端口被占用无法完成IIS Express的输出 这时候要考虑到自己在Windows的IIS 是不是配置了该端口? 很明显,就是配置了一个8091的端口且还在启动中,这时候要先将 ...