上面这种图是订单服务确认了提交之后在通知积分服务,那么积分服务要是报错了,那么订单服务怎么回滚?那mq又怎么才能保持订单服务和积分服务事务的一一致性呢?

java分布式事务求解
上面这种图是订单服务确认了提交之后在通知积分服务,那么积分服务要是报错了,那么订单服务怎么回滚?那mq又怎么才能保持订单服务和积分服务事务的一一致性呢?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- Silwings银翼 2023-11-10 10:17关注
从常规业务上说积分失败不应该导致订单失败,而是应该重试,如果是bug等因素导致则需要开发介入.
如果你硬要回滚,通常有两个方案.
1.二阶段提交
订单服务将消息推送到mq成功时,发起一个两阶段提交事务,积分服务收到消息后,也参与到事务中,如果处理成功,提交事务,确认事务完成后向mq发送消息被成功处理的ack,,mq删除消息.如果处理失败,触发事务回滚,不向mq发送ack(我不确定有没有失败的确认接口),mq未收到成功ack的情况下不会删除消息.
2.补偿
订单发送完消息后自己提交事务.积分收到消息如果处理失败,像mq发送积分处理失败的消息,订单监听这个消息,根据失败原因等情况进行回滚或其他操作.解决 无用评论 打赏 举报