这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
前提
关于系统设计,针对个人秋招面试,虽然说秒杀系统已经烂大街了,但是面试该问还得问,java的感觉挺多人写秒杀系统和牛客系统的,还是多了解了解应付面试吧。
如何做系统设计
- 场景分析:功能需求、并发量等
- 存储设计:数据库的选用、缓存的设计
- 服务设计:业务功能的实现和逻辑的整合
- 可扩展性:性能的优化、提高鲁棒性和可扩展性
系统瓶颈的发现
- 火焰图分析:单体代码的测试
- 链路分析:针对微服务的解决
- 性能测试:没啥说的
秒杀业务特点
- 瞬时流量高
- 读多写少
- 实时性要求高
设计秒杀系统
功能:秒杀活动发布、秒杀商品详情、秒杀下单
存储:本地缓存、Redis、MySQL
基础组件:ID生成器、缓存组件、MQ组件、限流组件
通常,从秒杀开始到结束,往往会经历三个阶段:
- 准备阶段:这个阶段也叫作系统预热阶段,此时会提前预热秒杀系统的业务数据,往往这个时候,用户会不断刷新秒杀页面,来查看秒杀活动是否已经开始。在一定程度上,通过用户不断刷新页面的操作,可以将一些数据存储到Redis中进行预热。
- 秒杀阶段:这个阶段主要是秒杀活动的过程,会产生瞬时的高并发流量,对系统资源会造成巨大的冲击,所以,在秒杀阶段一定要做好系统防护。
- 结算阶段: 完成秒杀后的数据处理工作,比如数据的一致性问题处理,异常情况处理,商品的回仓处理等。
针对这种短时间内大流量的系统来说,就不太适合使用系统扩容了,因为即使系统扩容了,也就是在很短的时间内会使用到扩容后的系统,大部分时间内,系统无需扩容即可正常访问。