这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
一、本堂课重点内容
- 系统设计方法论
- 电商秒杀业务介绍
- 课程实践
- 课程总结
二、详细知识点介绍
系统设计方法论
系统设计相关问题
- 为什么要做系统设计
- 系统设计的定义是什么
- 怎么做系统设计,如何落地一个系统
- 系统功能实现之后,如何分析瓶颈并优化
- 如何验证系统的可用性和稳定性
为什么要做系统设计
个人
- For面试
- 个人能力提升
- 拓展技术视野
工作
- 业务驱动
- 系统重构
- 突破和创新
总的来说,就是为了解决问题。
如何评估一个系统
- 可用性
- 扩展性
- 易用性
- 安全性
- 性能
- 耦合性
- 可维护性
- 伸缩型
系统设计的定义
系统
- 关联的个体
- 规则运作
- 组成工作的整体
设计
- 设想和计划
- 目的
- 过程安排
因此,系统设计可以被定义为:为了达成某种目的,通过个体组成整体的过程。
如何做系统设计
可以从四个方面来入手
-
场景分析(Scenario)
什么系统,需要哪些功能,多大的并发量
-
存储设计(Storage)
数据如何组织,SQL存储,NoSQL存储
-
服务设计(Service)
业务功能实现和逻辑整合
-
可扩展性(Scale)
解决设计缺陷,提高鲁棒性、扩展性
如何发现系统的瓶颈
-
火焰图分析
-
链路追踪
由于现代微服务架构,一个服务的调用后面可能会有几十个服务的链式调用,因此,对调用链路追踪是很有必要的。
-
性能测试
如何保证可用性和稳定性
链路梳理
- 核心链路
- 流量漏斗
- 强弱依赖
可观测性
- 链路追踪
- 核心监控
- 业务报警
全链路测试
- 压力测试
- 负载测试
- 容量测试
稳定性控制
- 系统限流
- 业务兜底
- 熔断降级
容灾演练
- 混沌工程
- 应急手册
- 容灾预案
电商秒杀业务介绍
电商介绍
- 人代表消费者侧,包括消费者、用户、流量的来源。
- 货代表供给侧,包括商品、商家、供应链。
- 场代表交易环境,包括线下商场,线上电商。
商品:具有交易价值和属性的信息载体。
SPU:Standard Product Unit
SKU:Stock Keeping Unit
秒杀业务的特点
- 瞬时流量高
- 读多写少
- 实时性要求高
秒杀的挑战
- 资源成本
- 反欺诈
- 高性能
- 防止超卖
- 流量管控
- 扩展性
- 鲁棒性
三、实践练习例子
本次课程介绍了一个秒杀系统设计的实践例子。
设计过程
按照之前的四个方面来下手。
场景分析
功能
- 秒杀活动发布
- 秒杀商品详情
- 秒杀下单
并发
- 万人参与秒杀
- QPS 1w+
- TPS 1k+
存储设计
此处设计了三层存储,如下图所示
graph BT
MySQL-->Redis
Redis-->Localcache
最底层使用MySQL来存储,然后使用Redis来进行内存加速存储,而Localcache进一步加速。
以上为数据库各表字段。
服务设计
子服务
- 用户服务
- 风控服务
- 活动服务
- 订单服务
基础组件
- ID生成器
- 缓存组件
- MQ组件
- 限流组件
扩展
- 上层
- 流量隔离
- CDN
- 缓存优化
- 流量管理
- 下层
- 数据库扩展
- 服务水平扩展
- MQ扩展
- Redis扩展
- 服务垂直扩展
系统架构图
flowchart TD
subgraph 用户层
WEB
IOS
Android
end
subgraph 接入层
Nginx
end
subgraph 应用层
subgraph
发布活动
秒杀详情
秒杀下单
end
subgraph
ID生成器
限流组件
MQ组件
end
Cache组件
end
subgraph 基础层
Redis
RocketMQ
MySQL
end
用户层:::class1-->接入层:::class2
接入层-->应用层:::class3
应用层-->基础层:::class4
classDef class1 fill:#ffc000
classDef class2 fill:#ffff00
classDef class3 fill:#92d050
classDef class4 fill:#00ffd3
秒杀流程图
flowchart LR
subgraph
User服务
风控服务
Redis1(Redis)
Redis2(Redis)
end
subgraph
用户抢购
秒杀系统
MQ
订单服务
支付系统
end
订单超时检查--超时检查-->订单服务
用户抢购:::main==下单==>秒杀系统:::main
秒杀系统==削峰==>MQ:::main
MQ==消费MQ==>订单服务:::main
订单服务==支付==>支付系统:::main
订单服务--->MySQL[(MySQL)]
秒杀系统--预扣库存-->Redis2(Redis)
秒杀系统--风控校验-->风控服务
秒杀系统--登录校验-->User服务
秒杀系统--活动校验-->Redis1(Redis)
MySQL--刷新缓存-->Redis2
订单服务-.取消&下单失败库存回补.->MySQL
classDef main fill:lightgreen
其中,亮绿色标记部分为主线流程,区域部分为辅助。
四、课后个人总结
本次课程介绍了一个秒杀系统设计的实践例子,从场景分析、存储设计、服务设计、扩展等方面进行了详细的介绍,同时也介绍了一些常用的组件,如ID生成器、缓存组件、MQ组件、限流组件等。
通过本次课程的学习,我对秒杀系统的设计有了更深的理解,同时也对一些常用的组件有了更深的了解。
最后总结三点重要的内容:服务无状态、批量写入和最终一致性。