设计秒杀系统
这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
如何评估一个系统
在系统设计和开发过程中,我们比较容易关注系统的功能维度,例如有没有实现预期功能,输入参数和输出参数是否匹配等等,这是比较容易测试和衡量的。
但是我们不能就此止步,因为满足功能是系统的基本要求,还需要关注系统的非功能维度,例如系统性能是否优秀,代码可扩展性如何,出现异常是否可以自动降级等等,这些指标决定了系统能否提供高质量的服务。
通常主要是通过来评估一个系统的架构:
ATAM(Architecture tradeoff Analysis Method)是卡梅隆大学软件工程协会提出来的一套架构权衡分析方法。
ATAM的评估目的是根据系统的质量属性和商业需求评估设计决策的结果。
ATAM希望揭示出架构满足特定质量目标的情况,使我们更清楚的认识到质量目标之间的联系,即如何权衡多个质量目标。
如何做好系统设计
-
场景分析
什么系统,需要哪些功能,多大的并发量
-
存储设计
数据如何组织,sql存储,nosql存储
-
服务设计
业务功能实现和逻辑整合
-
可扩展性
解决设计缺陷,提高鲁棒性、扩展性
秒杀系统设计
系统特点
- 高性能:秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键
- 一致性:秒杀商品减库存的实现方式同样关键,有限数量的商品在同一时刻被很多倍的请求同时来减库存,在大并发更新的过程中都要保证数据的准确性。
- 高可用:秒杀时会在一瞬间涌入大量的流量,为了避免系统宕机,保证高可用,需要做好流量限制
设计思路
将请求尽量拦截在系统上游
- 限流:屏蔽掉无用的流量,允许少部分流量走后端。假设现在库存为 10,有 1000 个购买请求,最终只有 10 个可以成功,99% 的请求都是无效请求
- 削峰:秒杀请求在时间上高度集中于某一个时间点,瞬时流量容易压垮系统,因此需要对流量进行削峰处理,缓冲瞬时流量,尽量让服务器对资源进行平缓处理
- 异步:将同步请求转换为异步请求,来提高并发量,本质也是削峰处理
- 利用缓存:创建订单时,每次都需要先查询判断库存,只有少部分成功的请求才会创建订单,因此可以将商品信息放在缓存中,减少数据库查询
- 负载均衡:利用 Nginx 等使用多个服务器并发处理请求,减少单个服务器压力