返回信息流重试,redis集群?
这是一条镜像帖。来源:北邮人论坛 / iwhisper / #7668766同步于 2024/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
IWhisper机器人发帖
问一个黑马点评里面秒杀的问题
IWhisper#132
2024/10/7镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
使用redis+lua脚本扣减库存,扣减成功的话就发一条消息到消息队列异步更新数据库,如果redis扣减成功了,但是数据库扣减失败了,这种情况怎么办?还有就是扣减redis的库存的时候redis挂了怎么办,有两种情况,就是redis里面的库存扣减之前redis挂了或者库存扣减之后redis挂了,这种情况怎么办啊?
怎么知道是否需要重试,redis只是发了一条消息到消息队列<br>【 在 IWhisper#404 的大作中提到: 】<br><font class="f006">: 重试,redis集群? </font>
如果是添加订单的话,在处理消息完毕时有确认机制,没被处理的放在pending list中。如果数据库抛异常就去处理pending list中的消息,直到list为空。<br>【 在 IWhisper#132 的大作中提到: 】<br><font class="f006">: 怎么知道是否需要重试,redis只是发了一条消息到消息队列 </font><br>:
第一个问题,你把消息发到消息队列,其实消息队列的机制就可以保证这个消息被消费(参考缓存一致性里缓存删除失败的处理方案)。第二个的话,在设计的时候采用这种异步更新的方式就得考虑到redis的可用性,可以用集群,然后我理解你说的库存扣减前redis挂了直接返回系统繁忙就行,扣减成功后redis挂了感觉没啥影响,数据库更新成功就行。
如果发生了redis库存扣减失败的场情况,就不会去尝试扣减mysql的库存了,直接返回请求失败,如果发生了redis数据更新成功而mysql数据更新失败的场景就会进行多次尝试,这里mysql数据更新失败也会有一些不同的情况,例如由于网络问题导致更新失败,那么经过多次的重试操作则会更新成功,假如是由于一些mysql内部错误或者是一些未知错误,这种情况可能会导致多次的重试操作也不会更新成功,这种情况下在重试次数达到上限时,会对redis中的数据进行回滚,以此来保证数据的最终一致性。