这是我参与「第五届青训营 」伴学笔记创作活动的第 十 天
- 系统设计
- 电商秒杀
系统设计
如何区别架构设计与系统设计?
架构设计与系统设计的关系可以比作骨与肉的关系。架构设计是粗线条的宏观结构描述,系统设计不同,它是更加细致的反映了模块间关系、与模块和数据间关系。
如何做系统设计?
4S分析法:
- Scenario(场景):需要设计哪些功能,设计的质量性能等等需要有什么要求
- Service(服务):大系统拆分成小系统
- Storage(存储):数据如何存储,如何访问
- Scale(拓展):优化维护,解决缺陷,处理可能遇到的问题
如何分析系统瓶颈和优化?
- 火焰图分析:阻塞和锁抢占问题
- 链路分析:分析链路余量
- 全链路压测:模拟请求,压力测试
如何验证系统的可用性和稳定性?
- 链路梳理
- 可观测性
- 全链路测试
- 稳定性控制
- 容灾演练
电商秒杀
基本概念:
- SPU(Standard Product Unit),商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。
- SKU(Stock Keeping Unit),物理上不可分割的最小存货单元。
- 秒杀特点:读多写少,瞬时并发量大
秒杀的挑战:
- 资源有限性
- 反欺诈
- 高性能
- 防止超卖
- 流量管控
- 扩展性
- 鲁棒性
4S分析:
-
场景
- 秒杀场景读多写少,可使用Redis作为缓存层,并且进行缓存预热
- 并发量大,不能直接调用扣减库存、生成订单等API,可以加入MQ进行流量削峰
-
服务
- 将系统细分为如下模块:秒杀服务、商品服务、订单服务和支付服务
-
存储
- 库存扣减应该加锁实现
- 借用Redis来实现分布式事务(seata,ZK都可以实现)
-
扩展
- 还能如何拓展增加秒杀系统的鲁棒性呢?
思考:
用户订单服务消息仍在MQ中没被消费就去查询订单详情怎么办?
可以确定的是订单详情无法查询到,怎么解决呢?可以先将订单缓存在Redis中,在订单被消费后再将缓存更新。