RabbitMQ的transaction、confirm、ack三个概念的解释 - brady-wang - 博客园

标签: | 发表时间:2021-08-02 13:06 | 作者:
出处:https://www.cnblogs.com

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

相关 [rabbitmq transaction confirm] 推荐:

RabbitMQ的transaction、confirm、ack三个概念的解释 - brady-wang - 博客园

- -
在使用RabbitMQ的过程中,肯定会遇到这样的几个概念:transaction、confirm、ack. 本文介绍一下这几个概念,以及他们之间的关系. RabbitMQ是采用的AMQP协议,AMQP协议定义了”确认”(acknowledgement),它是从consumer到RabbitMQ的确认,表示一条消息已经被客户端正确处理.

【架构】关于RabbitMQ

- - 学习笔记
1      什么是RabbitMQ. RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗. 消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:. 例如一个日志系统,很容易使用RabbitMQ简化工作量,一个Consumer可以进行消息的正常处理,另一个Consumer负责对消息进行日志记录,只要在程序中指定两个Consumer所监听的queue以相同的方式绑定到同一个exchange即可,剩下的消息分发工作由RabbitMQ完成.

spring @Transaction事务不生效问题

- - Java - 编程语言 - ITeye博客
如果你已经排除了以下问题:. 或是数据库本身不支持, 如MySQL的Myisam. 不防看看是不是由多数据源引起的:. 多数据源我们一般这样配置:. 这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.

RabbitMQ (三) 发布/订阅

- - CSDN博客架构设计推荐文章
转发请标明出处: http://blog.csdn.net/lmj623565791/article/details/37657225. 本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考. 上一篇博客中,我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者,如果你还不了解: RabbitMQ (二)工作队列.

rabbitmq java client api详解

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现. 每个rabbitmq-server叫做一个Broker,等着tcp连接进入. 在rabbitmq-server进程内有Exchange,定义了这个消息的发送类型. Queue是进程内的逻辑队列,有多个,有名字.

RabbitMQ:镜像队列Mirrored queue

- - 飞翔的荷兰人
        在上一节 《RabbitMQ集群类型一:在单节点上构建built-in内置集群》中我们已经学习过:在集群环境中,队列只有元数据会在集群的所有节点同步,但队列中的数据只会存在于一个节点,数据没有冗余且容易丢,甚至在durable的情况下,如果所在的服务器节点宕机,就要等待节点恢复才能继续提供消息服务.

RabbitMQ:RabbitMQ之消息确认机制(事务+Confirm) - 简书

- -
在Rabbitmq中我们可以通过持久化来解决因为服务器异常而导致丢失的问题, 除此之外我们还会遇到一个问题:生产者将消息发送出去之后,消息到底有没有正确到达 Rabbit服务器呢?如果不错得数处理,我们是不知道的,(即Rabbit服务器不会反馈任何消息给生产者),也就是默认的情况下是不知道消息有没有正确到达;.

MySQL 事务RUNNING状态引发的Transaction timed out: deadline问题

- - CSDN博客推荐文章
    朋友说简单的查询导致Transaction timed out: deadline问题,怀疑是数据库表锁了,. 1,应用故障描述Deadline问题: . 2,检查Innodb存储引擎状态以及表锁状态.         SHOW ENINGE INNODB STATUS;没有死锁信息以及其它异常信息;去查询系统表INNODB_LOCKS、INNODB_LOCK_WAITS表都为NULL,只有INNODB_TRX表有记录,并且处于长时间RUNNING状态,判断是因为事务没有提交或者回滚的缘故.

Transaction中SQL的顺序引起的死锁

- - BlogJava-首页技术区
因为项目的数据更新频率很高,导致经常出现死锁的问题. 感觉以下遇到的一种情况比较典型,也比较tricky,计之. 如以下两条非常简单的SQL语句,它们共同组成了一个Transaction,那么在多线程高频率执行时就会引起死锁问题(当然这里要考虑锁的级别问题,一般多类似这种系统都会选择行锁,那么以下引起死锁的条件是两条语句都对同一行操作): select  from  where  = ? .

MySQL数据库事务隔离级别(Transaction Isolation Level)

- - RSS - IT博客云
修改事务隔离级别的方法:. 1.全局修改,修改 mysql.ini配置文件,在最后加上. 1 #可选参数有: READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 这里全局默认是 REPEATABLE-READ,其实MySQL本来默认也是这个级别.