RabbitMQ的transaction、confirm、ack三个概念的解释

在使用RabbitMQ的过程中,肯定会遇到这样的几个概念:transaction、confirm、ack。本文介绍一下这几个概念,以及他们之间的关系。

RabbitMQ是采用的AMQP协议,AMQP协议定义了”确认”(acknowledgement),它是从consumer到RabbitMQ的确认,表示一条消息已经被客户端正确处理。RabbitMQ扩展了AMQP协议,定义了从broker到publisher的”确认”,但将其称之为confirm。所以RabbitMQ的确认有2种,叫不同的名字,一个consumer acknowledgement,一个叫publisher confirm。

根据AMQP协议规定,consumer acknowledgemenet是通过basic.ack方法实现的,consumer在收到一条消息后,可以向broker发送basic.ack方法,确认一条消息已经收到。在默认的情况下,consumer acknowledgement模式是开启的,如果不想发送basic.ack,可以在发送basic.consume方法时指定no-ack参数,关闭consumer acknowledgement模式。

Publisher confirm并没有在AMQ协议的基础上添加新的确认方法,而是复用了basic.ack方法。但是publisher confirm模式并不是默认打开的,需要调用confirm.select方法将channel设置成confirm模式。当开启了confirm模式之后,只有当一条消息被所有的mirrors接受之后,publisher才会收到这条消息的confirm,也就是一个basic.ack方法。

RabbitMQ支持事务(transaction)。事务模式也不是默认开启的,需要调用tx.select方法开启事务模式。当开启了事务模式后,只有当一个事务被所有的mirrors接受之后,tx.commit-ok才会返回给客户端。confirm模式和开启事务模式都可以保证”被所有的mirrors接受”,那么,开启confirm模式和开启事务模式有什么区别吗?不同点在于confirm是针对一条消息的,而事务是可以针对多条消息的(当然是针对同一个queue的多条消息)。另外就是,confirm模式只是针对publisher的设置,而事务模式即可以针对publisher,也可以针对consumer。如果针对publisher设置事务模式,则我们可以将多个basic.publish方法放在一个事务中,当所有的publish的消息被所有的mirrors接受后,publisher client会收到tx.commit-ok的方法。如果针对consumer设置事务模式,则我们可以将多个basic.ack方法放在一个事务中,收到tx.commit-ok时表示这些消息都被确认了。

时间: 2025-01-12 02:59:29

RabbitMQ的transaction、confirm、ack三个概念的解释的相关文章

RabbitMQ事务和Confirm发送方消息确认——深入解读

引言 根据前面的知识(深入了解RabbitMQ工作原理及简单使用.Rabbit的几种工作模式介绍与实践)我们知道,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示: 正常情况下,如果消息经过交换器进入队列就可以完成消息的持久化,但如果消息在没有到达broker之前出现意外,那就造成消息丢失,有没有办法可以解决这个问题? RabbitMQ有两种方式来解决这个问题: 通

js中confirm揭示三个按钮“是”“否”“取消”

js中confirm提示三个按钮"是""否""取消" 重载DOM中confirm window.confirm = function(str) {   str=str.replace(/\'/g, "'&chr(39)&'").replace(/\r\n|\n|\r/g, "'&VBCrLf&'");   execScript("n = msgbox('"

Java编码浅析(注意区分三个概念)(转)

Java与Unicode: Java的class文件采用utf8的编码方式,JVM运行时采用utf16. Java的字符串是unicode编码的. 总之,Java采用了unicode字符集,使之易于国际化. Java支持哪些字符集: 即Java能识别哪些字符集并对它进行正确地处理? 查看Charset 类,最新的JDK支持160种字符集.可以通过static方法availableCharsets拿到所有Java支持的字符集. Java代码   assertEquals(160, Charset.

数据库设计——三范式概念+实战

在利用三范式设计数据库的时候,以前总以为是先画完ER图,然后导出关系模式,最后用三范式去检验数据库设计的是否合理,but not!我们在一开始画ER图的时候,就应当和三范式联系起来,将错误消灭在源头.为了能最早的检验出错误,我们就要对ER图转换成关系模式的算法和三范式是如何消除冗余,避免冲突有深刻的了解,才能知道如何最早发现错误. 本文主要以机房收费系统数据库设计中的一些东西为例,结合三范式概念,简述下三范式. 一,1NF 定义: 如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是

PowerDesigner教程系列(三)概念数据模型

目标:本文主要介绍属性的标准检查约束.如何定义属性的附加检查. 一.定义属性的标准检查约束标准检查约束是一组确保属性有效的表达式.在实体属性的特性窗口,打开如图所示的检查选项卡. 在这个选项卡可以定义属性的标准检查约束,窗口中每项的参数的含义,如下 参数 说明 Minimum 属性可接受的最小数 Maximum  属性可接受的最大数 Default 属性不赋值时,系统提供的默认值 Unit 单位,如公里.吨.元 Format 属性的数据显示格式 Lowercase 属性的赋值全部变为小写字母 U

区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的 JVM 内存结构.Java 内存模型和 Java 对象模型,这就是三个截然不同的概念,但是很多人容易弄混. 可以这样说,很多高级开发甚至都搞不不清楚 JV

分布式、高并发和多线程三个概念的简单区分

每当提起分布式.高并发和多线程这三个概念的时候,很多的程序员都会认为分布式=高并发=多线程,即认为这三个概念是相同的,但实际上这种认为是错误的. 什么是分布式 关于分布式的概念,我们大可以如此理解:它是为了解决性能瓶颈问题以及单个物理服务器容量不足问题所采用的优化手段. 而分布式这个领域需要解决极多的问题,且这些问题都在不同的技术层面上,包括分布式文件系统.分布式缓存.分布式数据库和分布式计算等.一些名词如Hadoop.Zookeeper和MQ等也都都跟分布式有关. 如果从理念层面看待,分布式的

RabbitMQ学习之:(三)AMQP和RabbitMQ介绍

准备开始 高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范.作为线路层协议,而不是API(例如JMS2),AMQP客户端能够无视消息的来源任意发送和接受信息.现在,已经有相当一部分不同平台的服务器3和客户端可以投入使用4. AMQP的原始用途只是为金融界提供一个可以彼此协作的消息协议,而现在的目标则是为通用消息队列架构提供通用构建工具.因此,面向消息的中间件(MOM)系统,例如发布/订阅队列,没有作为基本元素实现.反而通过发送简化的AMQ实体,用户被赋予了构建例如这些实体的

RabbitMQ消息队列:ACK机制

每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式进行确认,也就是说,每次Consumer接到数据后,而不管是否处理完 成,RabbitMQ Server会立即把这个Message标记为完成,然后从queue中删除了. 如果一个Consumer异常退出了,它处理的数据能够被另外的Consumer处理,这样数据在这种情况下就不会丢失了(注意是这种情况