电商网站50W-100W高并发,秒杀功能是怎么实现的?
在淘宝、天猫、京东等国内大型电商平台“造节”的带领下,国内各电商平台纷纷跟进,双十一、双十二、618等电商专属节日也吸引了大量的用户参与。节前生意惨淡、访客寥寥,节日当天流量增长却异常迅猛,这对于广大程序猿同学和运维人员来说,无疑是巨大的考验。
秒杀系统的流量虽然很高,但是实际有效流量比较小;利用系统的层次结构,在每个阶段提前校验,拦截无效流量,可以减少大量无效流量涌入数据库,从而保障业务系统的正常运行;
第一步:利用浏览器缓存和CDN加速静态页面抵挡第一层流量
秒杀前,用户不断刷新商品详情页,造成大量的页面请求。所以我们需要把秒杀商品详情页与普通的商品详情页分开;对于秒杀商品详情页尽量将静态化的元素静态化处理,除了秒杀按钮需要服务端进行动态判断外,其他的静态数据可以缓存在浏览器和CDN上,这样秒杀前刷新页面的流量仅有一小部分会访问后端服务器和数据库;
第二步:利用redis缓存拦截部分流量(只读Redis)
利用CDN拦截第一级流量,第二级流量拦截我们使用redis,我们需要提前把秒杀的商品数据写入到Redis,并通过程序进行秒杀相应逻辑的设定(只允许通过对应秒杀数量的请求);
第三步:利用Redis缓存进行库存量的扣除(读写Redis)
成功下单后,进入下层服务,开始进行订单信息校验,库存扣除;为了避免直接访问数据库,我们使用Redis来进行库存扣除(库存数量提前写入redis);库存扣除时,服务器通过请求redis获取下单资格,由于redis是单线程模型,可以保证多个命令的原子性;
第四步:利用redis实现简单的消息队列异步下单入库
库存扣除后,需要进行订单入库,如果商品数量较少,可以直接操作数据库,但如果数据量较大,那么数据库锁冲突将带来很大的性能瓶颈,可以考虑使用 消息队列,当秒杀服务将订单信息写入消息队列后,即可认为下单完成,避免直接操作数据库;利用异步下单模块从redis中读取订单并写入数据库即可完成;
简单的设计能够有效抵挡秒杀大流量的冲击,不知各位程序猿同学有没有更好的建议呢?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论