mq消息队列的补偿方式

     在千锋“逆战”班学习的第17天。

如订单服务:
之前的做法是创建订单时,会将消息发送到消息队列,然后消费者消费消息,做扣减库存等操作

在创建订单之前,此时会先发送一条消息到一个独立消息服务,此时消息的状态为init,创建订单完成后,会再次发送消息到独立消息服务,并且将消息状态改为sent,最后由独立消息服务向队列中发送消息,消费者消费消息,服务执行成功,会向独立消息服务回复ack,此时消息状态为end 结束。

假如说创建订单之前发送消息成功,但是订单库中没有这条订单,就会将这条消息直接删除。
如果在2次发送消息时,遇到不可预期的错误,如网络波动等,无法将消息的init状态改为send。这里会有一个定时任务,就是一直轮询消息为init状态的消息。当发现消息状态为init,并且订单创建成功,此时定时任务就会将状态改为sent,并且直接向队列发送消息。

如果扣减库存失败,这里会有一个定时任务,会轮询状态为sent的消息,持续向队列发送,直到状态为end,那也就以为者库存扣减成功,如果重试次数达到阈值,就需要人工介入。这里有个问题就是假设定时任务的间隔为5s,而扣减库存需要6s,那么就很容易照成一个订单被扣减多次。因此这里需要在扣减库存的接口上做幂等性的保障!

中国加油!! 武汉加油 !! 我加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值