Rocket事务消息
RocketMQ支持事务消息来提供分布式事务功能,事务消息分为两个部分:
- 事务的发送和提交,即两阶段提交
- 事务状态回查
其中,事务的发送和提交的步骤如下:
- Producer发送一个half消息给MQ Sever,half消息是对消费者不可见的,用来检测MQ Sever是否可用
- MQ Sever对该half消息返回一个响应表示half消息接收成功
- Producer确认Sever可用之后,发起本地事务执行
- 本地事务执行成功或者失败之后,Producer提交一个二次确认消息
- MQ Sever收到二次确认消息后,如果是这个消息是commit,将half消息状态修改为Consumer可见,如果消息是rollback,则将half消息删除
而在第4步因为某些异常导致执行失败了,则half消息将无法得到确认,所以RocketMQ还提供了一个回查机制:
- MQ Sever在half消息等待一定时间未确认后,会对Producer发起回查请求
- 此时Producer再去检查本地事务状态,然后重新提交commit或者rollback二次确认
事务消息回查时,事务可能由3种状态:
- 提交事务
- 回滚事务
- 未知事务:未确定状态,需要再次回查
回查是有限制的,默认只能回查不超过15次,超过15次还不能确认消息状态的则默认当作回滚
事务消息的 缺点:
- 不支持延时消息和批量消息
- 回查机制可能导致消息堆积