聊聊秒杀系统
0. 什么是秒杀
秒杀场景是指有限数量的商品以极低的价格售卖,在极短的时间内吸引来大量用户抢购。
1. 面对的问题和挑战
因为秒杀场景的特点,所有会带来三大技术挑战:
系统高并发压力
对现有业务场景的冲击,因为秒杀活动带来的高并发请求会对其他业务造成影响,致使其他服务响应变慢或不可用。
对现有技术架构的冲击,针对日常访问量设计的前端页面、后端服务和数据库服务等整套架构都无法应对秒杀带来的突发的大量用户并发请求。
系统网络流量压力
随并发数增加,图片,JS 和 CSS 等资源的请求数同样增加,这些资源的请求会占用网站带宽资源,极端情况下将带框耗尽。
安全性问题
需要防止秒杀器等恶意软件恶意下单
需要保证商品在活动开始后才可购买
2. 解决方案
针对高并发压力
独立开发,独立部署
新系统没有历史包袱,可以快速支撑业务。
独立部署、使用单独域名避免对现有系统影响,
简化操作流程,减少后端请求
尽量简化操作流程,简化页面,减少对后端服务的请求
动静分离(请求)
静态请求和动态请求分离,能静态化就静态化,能不从服务器后就就不能服务器获取。分离后的静态页面可以缓存起来
冷热分离(数据)
将秒杀涉及到的数据和日常业务数据分离,热数据可以独立数据库部署并且提前缓存预热
阶梯限流
通过计数器,条件筛选器等技术手段在各个流程限制访问人数,目的是将真正执行下单的并发数降到最低,保护后端系统。
消息队列消峰
在下单等必须写数据库操作之前加上消息队列缓冲并发写操作,保护后端系统。
针对网络流量压力
图片、文件压缩
开启 HTTP 压缩
尽量减小文件的大小
减少页面请求数量
将多次请求合并为一次请求
客户端缓存
静态资源上 CDN
针对安全问题
如何防止秒杀器?
对于秒杀器行为和人工操作行为在技术上区分难度不小。如果加上相应的排查逻辑对系统性能有一定影响,得不偿失。如果非要避免秒杀器等自动抢单行为,可以通过业务方式实现。例如添加验证码,既能最大限度的限制自动抢单行为,也能对操作起到限流的作用。
如何保证商品在活动开始后才可售?
首先,我们可以将商品的售卖地址(其实就是售卖商品的 id 等必须参数)通过后端请求获取,活动开始前无数据,活动开始后返回数据。前端通过判断后端接口返回的结果判断页面购买按钮是否可点击。
上面的方法只能防外,不能防内(知道链接规则的人还是可以拼接链接,提前购买)。我们再在购买链接上加上一层 token 验证机制,token 也由后端随机生成,用户访问链接有后端验证 token。这样就可以保证商品只有在活动开始之后才能购买。
Plan B
服务降级
如果服务或数据库和原有业务有共用部分,一旦共用部分有压力可以随时将秒杀服务降级,避免原业务受影响。
版权声明: 本文为 InfoQ 作者【Jerry Tse】的原创文章。
原文链接:【http://xie.infoq.cn/article/2924b80b3023d7e78a9fd3387】。文章转载请联系作者。
评论