0
点赞
收藏
分享

微信扫一扫

RocketMQ 事务消息原理

四月天2021 2022-04-05 阅读 63
中间件

RocketMQ 事务消息原理

依赖于 TransactionListener 接口实现

  • executeLocalTransaction() 在发送消息后调用,用于执行本地事务,如果本地事务执行成功,RocketMQ 再提交消息

  • checkLocalTransaction() 用于检查事务是否执行成功,RocketMQ 依赖此方法做补偿

通过内部的两个 Topic 来实现对消息的两阶段支持

prepare:将消息(消息带有事务标识)投递到一个名为 RMS_SYS_TRANS_HALF_TOPIC 的 topic 中,而不是投递到真正的 topic 中

commit/rollback:producer 再通过 TransactionListener 的 executeLocalTransaction() 执行本地事务,当producer 的 事务处理成功或者失败后,producer 会向broker 发送 commit 或者 rollback 命令,如果是 commit 会将消息投递到真实的 topic 中,然后再投递一个表示删除的消息到 RMS_SYS_TRANS_HALF_TOPIC 中,表示当前事务完成;如果是 rollback,则只需投递表示删除的消息即可

  • Prepare失败:给应用返回发送消息失败
  • 事务失败:发送回滚命令给 broker,由 broker 执行消息回滚
  • commit 或 rollback 失败:由 broker 定时向 producer 发起事务检查,如果本地事务成功,则提交消息事务,否则回滚事务
    事务检查有两种情况
  • commit/rollback:broker 会执行相应的操作
  • 如果是 TRANSACTION_NOT_TYPE,则一段时间后再次及检查,当检查的次数超过上限(默认15次),则丢弃消息
举报

相关推荐

0 条评论