这是我参与「第五届青训营」伴学笔记创作活动的第5天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。
系统设计方法论
为什么要做设计,让系统能正确解决实际问题,满足实际需求。
系统是关联的个体 ,根据规则运作,组成工作的整体。(不同于 组件,框架,架构设计)
如何做系统设计
- 场景:功能需求?非功能需求?
- 存储:数据如何组织,采用何种数据库?
- 服务:业务如何设计,逻辑如何整合?
- 拓展:如何设计/重构以提高系统的鲁棒性和拓展性
如何发现系统瓶颈
- 火焰图分析
- 调用链路追踪
- 性能测试(压测)
系统的可用性和稳定性的保障
- 链路梳理
- 核心链路
- 流量漏斗
- 强弱依赖(可在负载过高的环境下通过服务降级来保障核心业务的稳定性)
- 可观测性
- 链路追踪
- 核心监控
- 业务报警
- 全链路测试
- 压力测试
- 负载测试
- 容量测试
- 稳定性控制
- 系统限流
- 业务兜底
- 熔断降级
- 容灾演练
- 混沌工程
- 应急手册
- 容灾预案
秒杀系统设计
秒杀业务的特点
- 瞬时流量高
- 读多写少
- 实时性要求高
挑战
- 资源有限性
- 反欺诈
- 高性能
- 防止超卖
- 流量管控
- 扩展性
- 鲁棒性
秒杀流程
- 用户下单抢购
- 系统响应
- User服务
- 风控服务
- 活动校验
- 预扣除库存(如果没有命中缓存,访问持久存储)
- 通过MQ进行削峰
- 订单服务对MQ进行消费
- 订单服务访问mysql扣除库存(需要检查订单是否有效)
- 通过支付系统支付
这样的设计使得系统能够承载较大的访问流量,同时在关键数据处理中进行了严格的检验,整体上保证了数据的最终一致性(BASE)。