写在前面
秒杀系统是经常需要优化的系统,对架构设计要求很高,面试过程中也经常问到,今天就来系统学习一下如何优化秒杀系统
秒杀场景
- 每个人都读自己的数据:im系统,如qq,微博
- 一个人读多个人的数据:微博关注人的动态、微信朋友圈动态、抖音关注的博主动态
- 多个人读取一个的数据:12306买票、小米手机官网抢手机
优化方向
- 将请求尽量拦截在上游,越上游越好。
- 缓存
常见系统架构
客户端(浏览器、app)-》网关层-》服务层-》数据库层
因此优化主要从这4个层面考虑
各层次优化
客户端
- 产品层面,用户点击“查询”或者“购票”后,按钮置灰,禁止用户重复提交请求;
- 代码层面,限制用户在x秒之内只能提交一次请求;
这种办法只能拦住普通用户(但99%的用户是普通用户)对于群内的高端程序员是拦不住的
网关层
- 限流。对同一个用户一定时间内只能访问一次。
- 缓存。对相同的请求直接返回缓存的内容。尤其是秒杀系统,对数据准确性要求并不严格。
服务层
- 消息队列。将请求放入指定大小的队列中,开启指定数量线程处理请求,对于其他请求返回失败或者等待。
- 异步。异步处理请求,对客户端返回成功,页面显示处理中。
数据库层
- 分库分表
- 主从:一主多从
总结
本文主要从请求经过的层次来优化秒杀系统,其中每个层次优化方法还有多种,我的另外一篇文章面试:如何设计高并发系统从服务部署、后端架构方面介绍了一些优化
参考
[1]架构 秒杀系统优化思路
[2]面试:如何设计高并发系统