在千锋“逆战”班学习的第17天。
如订单服务:
之前的做法是创建订单时,会将消息发送到消息队列,然后消费者消费消息,做扣减库存等操作
在创建订单之前,此时会先发送一条消息到一个独立消息服务,此时消息的状态为init,创建订单完成后,会再次发送消息到独立消息服务,并且将消息状态改为sent,最后由独立消息服务向队列中发送消息,消费者消费消息,服务执行成功,会向独立消息服务回复ack,此时消息状态为end 结束。
假如说创建订单之前发送消息成功,但是订单库中没有这条订单,就会将这条消息直接删除。
如果在2次发送消息时,遇到不可预期的错误,如网络波动等,无法将消息的init状态改为send。这里会有一个定时任务,就是一直轮询消息为init状态的消息。当发现消息状态为init,并且订单创建成功,此时定时任务就会将状态改为sent,并且直接向队列发送消息。
如果扣减库存失败,这里会有一个定时任务,会轮询状态为sent的消息,持续向队列发送,直到状态为end,那也就以为者库存扣减成功,如果重试次数达到阈值,就需要人工介入。这里有个问题就是假设定时任务的间隔为5s,而扣减库存需要6s,那么就很容易照成一个订单被扣减多次。因此这里需要在扣减库存的接口上做幂等性的保障!
中国加油!! 武汉加油 !! 我加油!!