赞
踩
之前完成了一个秒杀下单系统的开发,现在总结一下,
业务场景是社区电商, 疫情期间,社区准备了一批口罩,打算分批让用户抢购。那时我们还在过年,客户也没通知我们,然后我们这个小电商系统,在当晚就挂掉了。下面是我们当时的架构:类似下面
稍微思考到这个架构的问题,用户下单时,redisson进行加锁时,会让其他线程等待。所以在并发大时,会导致tomcat连接数超限。后面查询日志也证明了如此,所以当时临时的解决方案是,重启+增加应用容器。总算勉强度过。
后面我们紧急改造了我们的业务j流程,变成了下面这样:
主要做了两点改变:
1.将查询库存放到了redis中
2.将实际的下单功能放到了,MQ应用中。
这样极大的提高了前端应用的承载能力,经实战测试 2万的口罩,3分钟内全部卖空,系统平稳运行。
首先先看一下我们现在具体的秒杀流程。
文字表述如下:
看完整个详细流程,已经解决了主要的高并发问题,现在讲讲实际遇到的一些问题:
因为我们公司目前将redis的作用就是缓存,所以当redis快满了时,运维会将redis进行清空。(虽然有做redis 内存淘汰侧率,但是主要是总有人使用redis时没设置redis的过期时间),所以redis缓存失效的情况,需要考虑,所以我们mq消费时,会重新加锁,如果发现库存不足,会将结果存入redis。前端通过oderNo轮询就知道订单失败。
情景一 :提交两个商品,一个redis 库存够,另一个redis库存不够如何处理?
情景二:提交两个商品,一个在redis中有库存,但库存不足,另一个redis没有库存,需要从数据库查询,但库存足够本次购买:
答:这个我们处理思路是,判断是否超卖 循环中判断,但是所有redis存库存的操作,解锁前统一保存到redis。(我们是 redis cluster,分片了不支持事务);
这个当时我们是考虑到库存存到redis了,并设置过期时间,所以无论商家改大或者该小,都不会导致错误。但是,由于MQ消费消息,是有并发锁的,这个时候去看的库存,是不真实的,因为有许多订单是已经提交,但是没有落库。所以我们禁止了秒杀开始后修改库存
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。