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时表示这些消息都被确认了。

参考:

http://www.rabbitmq.com/confirms.html

http://www.rabbitmq.com/amqp-0-9-1-reference.html#class.tx

http://www.rabbitmq.com/amqp-0-9-1-reference.html#class.confirm

时间: 2024-11-05 21:42:05

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

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

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

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

编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字符集     Java与Unicode:   Java的class文件采用utf8的编码方式,JVM运行时采用utf16.   Java的字符串是unicode编码的.   总之,Java采用了unicode字符集,使之易于国际化.   Java支持哪些字符集:   即Java能识别哪些字符集并对它

ElasticSearch 攻略(三)概念认识

直接上代码固然好,但没有经过一番理解之前,真正属于自己的光环是不会加持太久的. 要使用 es,不但要求能理解其概念,而且在开始的时候,要对 Lucene 的相关的概念有个感性的认识,毕竟 es 索引底层基于 Lucene 的. 天下文章 N 个抄.我把人家一些好的的文章截图了,以飨读者.<文章出处> es 关键概念: 归纳上面所说的,就是:  es 的 index --> DB , es 的 type --> table, es 的 Document -->对应 table

安卓第三夜 概念漫游(上)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    拿起一个手机,总是满屏的应用图标.点击图标,选择应用,玩一把游戏,刷一下微博,写一篇日记."叮咚"一声,邮件应用提醒有一封新来的邮件.在安卓里,眼花缭乱的应用承载着各种有趣的功能.欢迎来到安卓应用的世界. 每一个应用都是存储在手机中的一段小程序.编写这段小程序,是每个安卓开发者的主要工作.程序运行后成为一个进程后,在进程的内存空间中新建一个Dalvik虚拟机.程序

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

原文http://www.cnblogs.com/yxonline/archive/2007/04/09/705718.html 目标:本文主要介绍属性的标准检查约束.如何定义属性的附加检查. 一.定义属性的标准检查约束标准检查约束是一组确保属性有效的表达式.在实体属性的特性窗口,打开如图所示的检查选项卡. 在这个选项卡可以定义属性的标准检查约束,窗口中每项的参数的含义,如下 参数 说明 Minimum 属性可接受的最小数 Maximum  属性可接受的最大数 Default 属性不赋值时,系统

Oracle实例与数据库的概念详细解释

刚接触ORACLE的人肯定会对实例和数据库感到困惑,实例到底代表些什么?为什么会有这个概念的出现? ORACLE实例 = 进程 + 进程所使用的内存(SGA)实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态! 数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件 数据库是永久的,是一个文件的集合. ORACLE实例和数据库之间的关系 1.临时性和永久性 2.实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义 3.一个实例在其生存期

从伪概念中解释什么是真正的云呼叫中心?

摘要:互联网发展至今,炒概念俨然成了行业标配.随着云计算技术的成熟,构建于云端的服务逐渐普及,呼叫中心业务仿佛炸开了花.各家纷纷推出云呼叫中心,响应通讯界.面对众多的宣传厂家,我们该如何选择?这些厂家是技术呈现还是概念炒作?     鱼龙混杂的今天,滥竽充数的还是大多数.那么什么是真正的云呼叫中心呢?根据百度百科和其他相关资料,通讯技术结合互联网,利用云计算.云存储构建的呼叫中心可称得上是云呼叫中心.对,这里就着重强调了两个名词,"云计算"."云存储".传统自建式.

RabbitMQ基础概念详解

RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然. AMQP的主要特征是面向消息.队列.路由(包括点对点和发布/订阅).可靠性.安全. RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.A

RabbitMQ 使用参考

1. 安装 从网站 http://www.rabbitmq.com/install-generic-unix.html 下载到二进制源码, 进入sbin 目录, 直接运行 server 即可. 默认服务监听在 5672 端口上(带上 SSL 默认在 5671 上). 2. 基本概念 RabbitMQ , 是一个使用 erlang 编写的 AMQP (高级消息队列协议) 的服务实现. 简单来说, 就是一个功能强大的消息队列服务. 通常我们谈到队列服务, 会有三个概念, 发消息者 , 队列 , 收消