关于系统设计 | 青训营笔记

96 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第5天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。

系统设计方法论

为什么要做设计,让系统能正确解决实际问题,满足实际需求。

系统是关联的个体 ,根据规则运作,组成工作的整体。(不同于 组件,框架,架构设计)

如何做系统设计

  1. 场景:功能需求?非功能需求?
  2. 存储:数据如何组织,采用何种数据库?
  3. 服务:业务如何设计,逻辑如何整合?
  4. 拓展:如何设计/重构以提高系统的鲁棒性和拓展性

如何发现系统瓶颈

  1. 火焰图分析
  2. 调用链路追踪
  3. 性能测试(压测)

系统的可用性和稳定性的保障

  • 链路梳理
    • 核心链路
    • 流量漏斗
    • 强弱依赖(可在负载过高的环境下通过服务降级来保障核心业务的稳定性)
  • 可观测性
    • 链路追踪
    • 核心监控
    • 业务报警
  • 全链路测试
    • 压力测试
    • 负载测试
    • 容量测试
  • 稳定性控制
    • 系统限流
    • 业务兜底
    • 熔断降级
  • 容灾演练
    • 混沌工程
    • 应急手册
    • 容灾预案

秒杀系统设计

秒杀业务的特点

  • 瞬时流量高
  • 读多写少
  • 实时性要求高

挑战

  • 资源有限性
  • 反欺诈
  • 高性能
  • 防止超卖
  • 流量管控
  • 扩展性
  • 鲁棒性

秒杀流程

  1. 用户下单抢购
  2. 系统响应
    1. User服务
    2. 风控服务
    3. 活动校验
    4. 预扣除库存(如果没有命中缓存,访问持久存储)
  3. 通过MQ进行削峰
  4. 订单服务对MQ进行消费
  5. 订单服务访问mysql扣除库存(需要检查订单是否有效)
  6. 通过支付系统支付

这样的设计使得系统能够承载较大的访问流量,同时在关键数据处理中进行了严格的检验,整体上保证了数据的最终一致性(BASE)。