RocketMQ支持事务消息来提供分布式事务功能,事务消息分为两个部分:

  1. 事务的发送和提交,即两阶段提交
  2. 事务状态回查

事务消息
其中,事务的发送和提交的步骤如下:

  1. Producer发送一个half消息给MQ Sever,half消息是对消费者不可见的,用来检测MQ Sever是否可用
  2. MQ Sever对该half消息返回一个响应表示half消息接收成功
  3. Producer确认Sever可用之后,发起本地事务执行
  4. 本地事务执行成功或者失败之后,Producer提交一个二次确认消息
  5. MQ Sever收到二次确认消息后,如果是这个消息是commit,将half消息状态修改为Consumer可见,如果消息是rollback,则将half消息删除

而在第4步因为某些异常导致执行失败了,则half消息将无法得到确认,所以RocketMQ还提供了一个回查机制:

  1. MQ Sever在half消息等待一定时间未确认后,会对Producer发起回查请求
  2. 此时Producer再去检查本地事务状态,然后重新提交commit或者rollback二次确认

事务消息回查时,事务可能由3种状态:

  1. 提交事务
  2. 回滚事务
  3. 未知事务:未确定状态,需要再次回查

回查是有限制的,默认只能回查不超过15次,超过15次还不能确认消息状态的则默认当作回滚

事务消息的 缺点:

  1. 不支持延时消息和批量消息
  2. 回查机制可能导致消息堆积

标签: none

添加新评论