- 重试 or 回滚?视情况而定。
- 下单:需要更新订单和扣减库存,如果没有库存了,不断重试没有意义,只会增加资源消耗,这时候使用回滚更好。
- 物流发货:需要更新订单,如果因为网络问题导致更新订单失败,那么不断重试是没问题的,因为不涉及争抢资源。
- 网络超时怎么办?
- 参考 Seata,每个节点保存一张本地事务提交表,记录事务提交的 id。用这个表来判断事务是否提交成功。
- 事务提交了,还没写入到本地事务提交表,发生了 Full GC,上游以为事务没有提交,发起重试操作,怎么办?
- 本地事务+消息表,使用定时任务轮询消息表。本地事务提交后,发送消息,并写入消息表。如果消息发送失败,定时任务会不停地重试,达到重试上限后系统告警。在后台页面可以看到哪个消息发送失败了,并且有重试按钮(人工兜底)。
Reference