学习
实践
活动
专区
工具
TVP
写文章

分布式消息队列ActiveMQ(五)事务管理

首先,我们之前的文章中有个地方需要纠正一下。在ActiveMQ中,有消息生产者和消费者,分别对应我们常说的服务器端和客户端。ActiveMQ叫做Broker。因为ActiveMQ更多是一种消息中间件,用于负责传输消息和管理消息的一种机制。

之前的文章中,我们分别介绍了ActiveMQ的运行、部署,以及消息的4中模型,我们还研究了两种消息传输模式:P2P模式和Pub/Sub模式。我们在上一篇中介绍了Session中消息的确认机制有4种。我们研究了客户端手工应答模式。在之前的文章中介绍的都是消息的自动确认模式。本篇,我们介绍消息的事务管理特性。操作事务型的操作,我们将介绍怎么实现回滚。

ActiveMQ有支持两种事务,ActiveMQ的官方手册这样写到:

(1)JMS transactions - the commit() / rollback() methods on a Session

(which is like doing commit() / rollback() on a JDBC connection)。

(2)XA Transactions - where the XASession acts as an XAResource by communicating with the Message Broker, rather like a JDBC Connection takes place in an XA transaction by communicating with the database.

也就是说操作数据库,调用session的commit提交事务,调用rollback进行事务回滚。还有就是使用XAResource接口来操作全局事务与数据库或消息服务连接,也就是在分布式事务处理中会使用事务操作。

注:XAResource接口是基于X / Open CAE规范,也就是分布式事务处理规范的行业标准XA接口

在支持事务的session中,producer发送message时在message中带有 transaction ID。broker收到message后判断是否有transaction ID,如果有就把message保存在transaction store中,等待commit或者rollback消息。所以ActiveMq的事务是针对broker而不是producer的,不管session是否commit,broker都会收到message。

如果producer发送模式选择了persistent(持久化),那么message过期后会进入死亡队列。在message进入死亡队列之前,ActiveMQ会删除message中的transaction ID,这样过期的message就不在事务中了,不会保存在transaction store中,会直接进入死亡队列。具体删除transaction ID的地方是在:org.apache.activemq.util.BrokerSupport的doResend,将transaction ID保存在了originalTransactionID中,删除了transaction ID。

下面我们直接来看事务操作怎么使用。

首先,在Producer端启动事务,如下所示:

其次,在Consumer端,处理消息中出现异常,就进行事务操作,也就是在异常中进行事务的回滚操作。代码如下:

总结:

在ActiveMQ中,对于事务的操作是比较简单的。当我们处理数据库相关操作时,特别是写数据库的情况,我们可以采用这种处理方式。当然,在ActiveMQ中,还可以使用JtaTransactionManager 实现事务的控制。

思考1: 上文将的客户端自动应答,能代替事务操作吗?

我们知道事务的特性就是ACID原则,所谓的ACID原则就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这也是分布式系统中数据库操作的一个难点。

我们上文介绍的客户端手动应答,也就是接收不到消息,要求producer重新发送。这是基于没有收到消息的情况,是一种保证消息有效性的手段。

而事务型操作是在收到消息后,在处理消息的过程中发生异常,此时需要将数据库的数据恢复到操作前的状态。因此本质上两种方式的使用场景不同。

今天先介绍这么多吧,我本身也是在不断学习的过程中,不足的地方我会在后期的文章中加入讲解。学习到这儿,对ActiveMQ算是入门了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180530G1OX0Q00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券