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学习第七章:消息确认机制之事务机制的更多相关文章

  1. SpringBoot 整合 RabbitMQ(包含三种消息确认机制以及消费端限流)

    目录 说明 生产端 消费端 说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同 ...

  2. 消息队列RabbitMQ(三):消息确认机制

    引言 RabbitMQ的模型是生产者发送信息到 Broker (代理),消费者从 Broker 中取出信息.但是生产者怎么知道消息是否真的发送到 Broker 中了呢?Broker 又怎么知道消息到底 ...

  3. rabbitmq学习(七) —— springboot下的可靠使用

    前面的学习都是基于原生的api,下面我们使用spingboot来整合rabbitmq springboot对rabbitmq提供了友好支持,极大的简化了开发流程 引入maven <depende ...

  4. Java基础知识二次学习--第七章 容器

    第七章 容器   时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...

  5. C#高级编程 (第六版) 学习 第七章:委托和事件

    第七章 委托和事件 回调(callback)函数是Windows编程的一个重要方面,实际上是方法调用的指针,也称为函数指针. .Net以委托的形式实现了函数指针的概念,.Net的委托是类型安全的. 委 ...

  6. MQ确认机制之事务机制------tx

    一:介绍 1.介绍 在前面的说的模式中会出现一个问题. 就是生产者将消息发送出去到底有没有到达rabbitMq,默认情况下是不知道. 有两种解决方式. AMQP实现事务机制 Confirm机制. 这里 ...

  7. JMS 基本可靠性机制 和 事务机制

    4.3.1 基本可靠性机制4.3.1.1 控制消息的签收(Acknowledgment) 客户端成功接收一条消息的标志是这条消息被签收.成功接收一条消息一般包括如 下三个阶段:1.客户端接收消息:2. ...

  8. rabbitmq for C#的异步消息确认机制

    代码: using (var conn = RabbitmqHelper.GetConnection()) { using (var channel = conn.CreateModel()) { / ...

  9. RabbitMQ学习笔记2-理解消息通信

    消息包含两部分:1.有效载荷(payload) - 你想要传输的数据.2.标签(lable) - 描述有效载荷的相关信息,包含具体的交换器.消息的接受兴趣方等. rabbitmq的基础流程如下: Ra ...

  10. rabbitMQ学习笔记(七) RPC 远程过程调用

    关于RPC的介绍请参考百度百科里的关于RPC的介绍:http://baike.baidu.com/view/32726.htm#sub32726 现在来看看Rabbitmq中RPC吧!RPC的工作示意 ...

随机推荐

  1. 预处理指令详解(C语言

    一.预处理符号 预处理符号是C语言内置的符号,是可以直接使用的. 其中,若遵顼ANSI C,则__STDC__ 为1,否则未定义. 二.#define 1)定义标识符 define可以用来定义标识符, ...

  2. 如果还有问ARKIME不会部署安装,你就把这篇丢给他!

    前言 关于在线安装和离线安装的配合方式,在本文中不再赘述.基本就是准备在线.离线两个一模一样的环境,在在线环境中边安装边借助yumdownloader.wget等解析依赖和下载安装包,然后再离线环境中 ...

  3. Mac提升效率软件推荐

    1.HapiGo 高效启动器 能快速搜索文件.启动程序.打开网页.翻译.截图翻译等  相当于中文版的 Alfred 2.Rectangle 能快速对当前应用窗口进行分屏 3.iTerm2 一款比系统终 ...

  4. docker-compose简易编写和模板命令

    version: '3' service: mysql: #指定容器名称 restart: always # 代表知道docker 启动那么这个容器就跟着一起启动 image: daocloud.io ...

  5. Qt头文件引用其他类,主类头文件报错(1)invalid use of incomplete type 'class xx::yy' (2)forward declaration of 'class xx::yy'

    其实这个错误很蠢,由于代码是从cpp文件直接copy过来的就没仔细看,但是他这个报错很有迷惑性,我们来看图: 就这行代码,从cpp文件中复制过来的: 本来目的呢就是提升这个变量的作用域,但是呢!!!在 ...

  6. 公司官网百度搜素优化(www.curetech.cc)

    1.  解读" 百度搜素引擎网页质量白皮书 "  . 链接:https://pan.baidu.com/s/1fD7Cm93qsK01M0K1M1cIKw 提取码:9krx 2.  ...

  7. Python3开启自带http服务

    1.基本方式Python中自带了简单的服务器程序,能较容易地打开服务.在python3中将原来的SimpleHTTPServer命令改为了http.server,使用方法如下: 1. cd www目录 ...

  8. 12.java链表栈和数组栈

    栈是一个先入后出的有序列表,栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,一端为变化的一端,称为栈顶,另一端是固定的,称为栈底.先入的元素在栈底,最后放入的元素在栈顶,删除 ...

  9. 继承方式创建线程(继承Thread类)

    步骤: 用类继承Thread类 重写run()方法 在测试类中创建Thread的子类对象 通过此对象调用Start //1.类继承Thread public class AAA extends Thr ...

  10. Excel如何按名字提取另一张表上数据(跨表查询)

    1.Excel如何按名字提取另一张表上数据(跨表查询) 公式"=VLOOKUP(A3,[工资信息.xls]Sheet1!$A$3:$B$32,2,0)"原理. 1."A3 ...