秒杀系统设计 | 青训营笔记

130 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

手把手教你做系统设计之秒杀系统课程笔记

引言

为什么要做系统设计

  • 个人
    • 面试
    • 个人能力提升
    • 拓展技术视野
  • 工作
    • 业务驱动
    • 系统重构
    • 突破和创新

最终是要解决问题

系统设计的定义是什么

系统是什么

  • 关联的个体

  • 按照一定规则运作

  • 组成工作的整体

设计是什么

  • 设想和计划

  • 目的

  • 过程安排

定义

为了达成某种目的,通过个体组成整体的过程

如何做系统设计

流程

4S分析法:

  1. 场景分析(Scenario)

  2. 存储设计(Storage)

  3. 服务设计(Service)

  4. 可拓展性(Scale)

如何分析系统瓶颈和优化

  • 火焰图分析
    • 针对单个实例
    • 找出代码上的瓶颈
  • 链路追踪
    • 分析一次请求所经过的所有服务
    • 分析各个服务的耗时
  • 全链路压测
    • 整个系统的能力

如何验证系统的可用性和稳定性

  • 链路梳理
    • 核心链路
    • 流量漏洞
    • 强弱依赖
      • 弱依赖优先降级
  • 可观测性
    • 链路追踪
    • 核心监控
    • 业务报警
  • 全链路测试
    • 压力测试
    • 负载测试
    • 容量测试
  • 稳定性控制
    • 系统限流
    • 业务兜底
    • 熔断降级
  • 容灾演练
    • 混沌工程
    • 应急手册
    • 容灾预警

电商和秒杀

商品

  • SPU: Standard Product Unit
  • SKU: Stock Keeping Unit

秒杀业务的特点

  • 瞬时流量高

  • 读多写少

  • 实时性要求高

秒杀的挑战

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

设计秒杀系统

4S分析

场景

功能:

  • 秒杀活动发布

  • 秒杀商品详情

  • 秒杀下单

并发:

  • 万人参与秒杀

  • QPS 1w+

  • TPS 1k+

存储

三级存储:

MySQL -> Redis -> Localcache

SQL 表:

storage.png

服务

子服务:

  • 用户服务

  • 风控服务

  • 活动服务

  • 订单服务

基础组件:

  • ID生成器

  • 缓存组件

  • MQ组件

    • 提供异步、解耦等功能
  • 限流组件

扩展
  • 流量隔离

  • CDN

  • 缓存优化

  • 流量管控

  • 数据库扩展

  • MQ扩展

  • Redis 扩展

  • 服务水平扩展

  • 服务垂直扩展

系统架构图

实践

秒杀流程

项目源码

我学到的包括但不限于:

  • 缓存预热的思想

  • 使用 lua 脚本操作 redis 保证操作的原子性

  • 使用函数式编程让代码简洁优雅

  • 限流组件:使用AOP+Enum的方法实现

  • 分布式锁:在抽象父类中定义 close() 方法,实现自动解锁,避免手动释放

  • IdGenerater 与雪花算法

  • 使用 Jmeter 进行压力测试