首先说明一下,使用消息机制处理一个流程的分布式事务,就是要设计一个状态机,能够处理所有的正常、异常的流程。在课程的实例里面,由于时间关系,没有考虑所有的异常情况。
第一个问题,创建订单的时候失败,也就是锁票完成,在订单服务里,把订单信息写到数据库的时候出错。因为已经做过业务条件验证、锁票,这种错误应该是order服务停了、或网络错误、DB错误。如果是写数据库失败,也就是order服务读消息后重试多次后一直失败,很多MQ都可以设置把这个消息发到某个队列,或者默认会被发到一个死信队列(DLQ)。对于这种情况,我们可以专门写一个处理方法针对这个死信进行订单异常的处理,也就是票的解锁。
如果是服务退出,这个消息完全没有被消费,那么在服务启动以后,就会开始消费这个消息,这时候,我们可以通过在消息上加一个时间戳来标记消息创建时间,再通过一个超时时间来处理超时。由于在这个消息里面已经有了锁的票,就可以用来解锁。
最后需要说明的是,我们使用分布式系统、微服务系统,目的是为了通过一个方便开发和维护的系统,实现复杂、高并发的业务需求。不要轻易为了一个异常情况,就让系统别的过于复杂。
总之,订单还没有创建,就没法通过定时器来检查超时的订单,需要从其他方面来解决。