秒杀问题?困扰了许久问题

若采用mq 异步的扣减库存 ,redis中做秒杀,主从切换引起的超卖,当消费者端为防止超卖抛出异常时    生产者端如何获取到异常并返回给用户下单失败呢???

是不是只能同步进行秒杀啊 牺牲一定的并发量来保证严格不超卖
求佬们解答
#美团##字节##腾讯#
全部评论
个人看法。 首先看你的意思是在缓存中进行库存扣减,把后续扣减数据库库存的动作写入到消息队列,之后消费者需要做库存校验和扣减数据库库存保证不超卖。 你把检验库存的逻辑放到消息队列重,那么本身一定会有滞后性的,缓存那边一直再扣不做校验的往消息队列写,等消费者那边校验到无库存的时候,你缓存那边已经超卖了很多了,这时是没办法回流的,你之后继续消费的消息全是超卖的消息,再抛出异常于事无补。 考虑把校验库存操作放到处理完缓存之后,之后对当前缓存的库存数加setnx🔒,保证只有一个线程能拿到🔒,同时这些锁只有在秒杀活动结束之后在释放,防止因为主从切换导致的超卖,或者把其他线程的锁給释放了。
2 回复
分享
发布于 04-02 14:54 广东
问了 几个前辈 是说消费者端扣减失败后可以往mysql写入失败流水 生产者端要进行回查 判断是否真正下单成功 欢迎佬们继续提出更好的解决方案
1 回复
分享
发布于 03-27 00:23 安徽
联想
校招火热招聘中
官网直投
在新建一个队列,前端发秒杀请求时,也发给websocket服务器,之后你消费端失败发给新建的队列,广播给socket服务器,然后给前端。
点赞 回复
分享
发布于 03-26 23:27 湖南
这是点评吗,学长这理解感觉好深入
点赞 回复
分享
发布于 03-27 15:34 安徽
没做过秒杀,我感觉是不是可以消费者端把成功或者失败写入消息队列另一个channel让生产者端来读呢?
点赞 回复
分享
发布于 04-07 18:44 江苏
我觉得可以消费者写入失败可以刷日志,然后定时读日志,不过就是前端不能实时拿到结果😰
点赞 回复
分享
发布于 04-09 13:10 广东
可以把流程,先更新缓存将已发放优惠券数量+1,然后判断是否超发。没超发再异步通知数据库更新
点赞 回复
分享
发布于 04-28 11:52 山西
点赞 回复
分享
发布于 05-02 23:46 天津

相关推荐

4 99 评论
分享
牛客网
牛客企业服务