在淘宝、天猫、JD.COM等国内大型电商平台“造节”的引导下,国内电商平台纷纷效仿,双十一、双十二、618等电商专属节日也吸引了大量用户参与。节前生意惨淡,游人稀少,但放假当天客流量迅速增加,这对于程的广大学生和运维人员来说,无疑是一个巨大的考验。
秒杀系统虽然流量很高,但是实际有效流量比较少;利用系统的分层结构,在每个阶段提前检查,拦截无效流量,可以减少大量无效流量涌入数据库,从而保证业务系统的正常运行;
第一步:利用浏览器缓存和cdn加速静态页面,抵御第一层流量。
在秒杀之前,用户不断刷新商品详情页面,产生大量页面请求。所以我们需要把秒杀产品详情页和普通产品详情页分开;对于秒杀产品详情页,尽量让静态元素静态化。除了spike按钮需要服务器进行动态判断,其他静态数据都可以缓存在浏览器和cdn上,这样spike之前刷新页面的流量只有一小部分会访问后端服务器和数据库;
步骤2:使用redis缓存拦截一些流量(只读Redis)
使用cdn拦截一级流量,使用redis拦截二级流量,我们需要提前将秒杀商品数据写入Redis,通过程序设置秒杀的对应逻辑(只允许秒杀数量对应的请求);
第三步:使用Redis缓存(读写Redis)扣除库存
下单成功后,进入下层服务,开始查看订单信息,扣库存;为了避免直接访问数据库,我们使用Redis进行股票扣款(股票数量提前写入Redis);在扣除库存时,服务器通过请求redis获得下单资格。因为redis是单线程模型,可以保证多个命令的原子性;
第四步:使用redis实现简单消息队列异步单入库。
扣除库存后,订单需要入库。如果商品数量少,可以直接操作数据库,但是如果数据量大,那么数据库锁的冲突就会带来很大的性能瓶颈。可以考虑使用消息队列。当spike服务将订单信息写入消息队列时,可以认为订单完成,避免直接操作数据库。使用异步订购模块从redis中读取订单,并将其写入数据库。
简单的设计可以有效抵御大流量尖峰的冲击。程同学有什么更好的建议吗?
Copyright © 2019-2025 but6.com. All Rights Reserved. 八特科技 版权所有 深圳市八特科技有限公司 粤ICP备2022103497号-1