RocketMQ是如何实现事务消息的?

事务概念

  • 事务:逻辑上的一组操作,要么全部执行,要么全部不执行,以保证数据的一致性。

事务的四大特性(ACID)

  1. 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
  2. 一致性(Consistency):事务执行前后,数据库必须保持一致状态。
  3. 隔离性(Isolation):并发事务之间互不影响,中间状态不可见。
  4. 持久性(Durability):一旦事务提交,结果永久保存,系统崩溃也不会丢失。

本地事务与分布式事务

  • 本地事务:单体应用中,操作涉及同一数据库内多张表的事务。
  • 分布式事务:微服务架构中,操作可能涉及多个服务和数据库。

事务消息

  • 定义:一种高级消息类型,支持分布式场景下消息生产与本地事务的最终一致性。
  • RocketMQ事务消息:支持二阶段提交,与本地事务绑定,实现全局一致性。

RocketMQ事务消息实现原理

  • 2PC(两阶段提交)
    • 第一阶段:Producer发送预处理消息至Broker,此时消息未投递,Consumer不能消费。
    • 第二阶段
      • 如果本地事务成功,Producer发送提交事务消息,Broker投递消息给Consumer。
      • 如果本地事务失败,Producer发送回滚事务消息,Broker不投递消息。

回查事务消息流程

  • 如果Broker未收到二次确认,将向Producer发起回查,确认是提交还是回滚。

实战示例:PmHub分布式事务处理

  • 通过Seata处理添加任务的分布式事务逻辑。
  • 核心代码使用@GlobalTransactional注解,支持AT模式。

如何发送事务消息

  1. 定义事务消息Producer:设置事务监听器,包含执行本地事务和回查本地事务状态的方法。
  2. 修改TaskService类:实现添加任务的本地事务逻辑和事务状态回查逻辑。

注意事项

  • 超时机制:半事务消息超时默认4小时,超时未确认则默认回滚。

总结

  • RocketMQ事务消息是实现分布式事务的高性能解决方案,基于2阶段提交原理。
  • 强调理解原理的重要性,鼓励讨论和学习。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RocketMQ事务消息实现主要分为两个阶段:正常事务的发送及提交和事务信息的补偿流程。在正常事务的发送及提交阶段,事务消息的发送是在本地事务提交之前进行的。如果在发送事务消息之后发生异常,导致本地事务未能成功提交,那么事务消息也会被回滚。在事务信息的补偿流程中,RocketMQ会定期扫描未收到确认消息的Prepared消息,并执行事务回查的逻辑,主动去消息生产方确认事务状态。\[1\] 为了实现RocketMQ事务消息,需要使用RocketMQ事务专属的TransactionMQProducer,并设置一个事务监听器(TransactionListener)。在事务监听器中,需要实现接口方法,以等待本地事务的执行情况。此外,由于监听器需要等待本地事务的执行情况,所以在生产者发送完消息后不能立即关闭。\[3\] 综上所述,RocketMQ事务消息实现包括正常事务的发送及提交阶段和事务信息的补偿流程,需要使用TransactionMQProducer和设置事务监听器,以保证本地事务事务消息的一致性。\[1\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [RocketMQ事务消息](https://blog.csdn.net/qq_42877546/article/details/125404307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值