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

90 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
本次编程学习的基本环境配置如下
OS: macOS 13.1
IDE: Goland 2022.3
Go Version: 1.18
Python Version: 3.6

主要内容

  1. 系统设计方法论
  2. 电商秒杀业务介绍
  3. 课程实践和课程总结(简略)

详细分析

系统设计方法论

系统设计的动力

业务驱动、系统重构、突破和创新 系统设计往往可以决定业务系统的整体性能. 系统设计如果做的不好, 当环境发生突变的时候, 要付出成倍的代价来弥补. 系统设计不能仅仅考虑单一因素, 而要综合系统评估的多个角度进行考量.

系统评估的角度

性能、可用性、易用性、安全性、扩展性、耦合性、伸缩性、可维护性

系统设计的定义

系统是由若干关联的个体按既定规则运行而组成的达成特定目的的整体。系统设计是根据系统分析的结果,运用系统科学的思想和方法,设计出能最大限度满足所要求的目标 (或目的) 的新系统的过程。

系统设计内包括确定系统功能、设计方针和方法,产生理想系统并作出草案,通过收集信息对草案作出修正产生可选设计方案,将系统分解为若干子系统,进行子系统和总系统的详细设计并进行评价,对系统方案进行论证并作出性能效果预测。百度百科: 系统设计

系统设计的流程

  1. 场景(Scenario)分析: 要做什么系统, 需要哪些功能, 要支持多大的并发量
  2. 存储(Storage)设计: 数据如何组织, 倾向于一致性还是可用性, 用SQL还是NoSQL
  3. 服务(Service)设计: 业务功能实现和逻辑整合, 架构设计
  4. 可扩展性(Scale): 解决设计缺陷, 提高系统整体的稳定性和可伸缩性

系统功能实现后的瓶颈分析和优化

在之前的课程中, 我们已经学过了go语言的pprof性能分析工具, 其他语言完成的系统也有类似功能; 操作系统也提供了一些分析工具(多数仅提供信息展示, 如top, netstat等)

发现系统瓶颈, 最主要的手段包括: 火焰图分析, 链路追踪和性能测试(BenchMark)

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

  1. 链路梳理: 核心链路、流量漏斗、强弱依赖
  2. 可观测性: 链路追踪、核心监测、业务报警
  3. 全链路测试: 压力测试、负载测试、容量测试
  4. 稳定性测试: 系统限流、业务兜底、熔断降级
  5. 容灾演练: 混沌工程、应急手册、容灾预案

电商秒杀业务介绍

image.png

秒杀业务的特点

  1. 瞬时流量高
  2. 读多写少
  3. 实时性要求高

秒杀业务的挑战

高性能、高扩展性、稳定性、反欺诈、防止超卖、资源成本、流量管控...

秒杀系统的设计

场景分析

  1. 功能: 秒杀活动发布、秒杀商品详情、秒杀下单
  2. 并发: 参与秒杀的人数很多、QPS和TPS很高

存储分析

单纯依靠MySQL是远远不够的

image.png

image.png

服务分析

  1. 子服务: 用户服务、风控服务、活动服务、订单服务
  2. 基础组件: ID生成器(SnowFlake), 缓存组件、消息队列、限流组件

扩展

流量隔离、CDN、缓存优化、流量管控

数据库扩展、MQ扩展、Redis扩展

服务水平扩展、服务垂直扩展

image.png

秒杀流程图

image.png

以下信息仅从上图中获取

用户点击抢购按钮后, 下单请求就会发送到秒杀系统, 秒杀系统通过登录校验、风险校验、活动校验后确定用户具有活动资格, 然后通过Redis预扣库存.之后用户订单会被发往消息队列服务

订单服务从MQ中获取用户订单, 执行订单超时检查, 如果未超时, 则从MySQL数据库中确定扣减库存,如果取消或者下单失败则需要回补库存

支付系统完成最终的交易. 秒杀完成