myhearis

Results 2 comments of myhearis

这里我也发现是有bug的,因为浏览器是通过接口去轮询,而作者写的轮询接口逻辑是这样的:1、先查看秒杀成功的商品set集合中是否存在用户手机号,存在,返回秒杀成功。不存在,则判断redis中推送成功的消息set集合,这里是重点!当你ack超时,但是却成功推送到了MQ中,将不会记录到Redis中!于是在redis中找不到推送成功的记录(实际上已经推送成功了),于是给浏览器返回秒杀失败,但是实际上已经成功了!这是问题所在,解决这个问题有我觉得有这些方法,1、完善这个请求秒杀状态的接口,及时将推送成功信息写入redis中。2、适当增加等待ack的时间,如指数退避算法。3、没有接收到ack请求的,一律忽略,不进行后面的逻辑处理,这样返回秒杀失败也合情合理

> decr本来就是原子操作 如果 在分布式的条件下,多个消费者进行消费,这时候库存是1,两个秒杀请求都同时通过了校验,那么你直接减库存,哪怕是这原子操作,也最终是-1啊,所以我觉得得用分布式锁去防止这种情况。