这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天,参与青训营的第 21 天。今天主要学习了秒杀系统的设计。
系统设计方法论
系统:关联的个体按照某种特定规则运作则称工作的整体
设计:设想和计划
为了达成某种目的,通过个体组成整体的过程
如何做系统设计?
场景分析(Scenario)
存储设计(Storage)
服务设计(Service)
可拓展性(Scale)
发现系统的瓶颈?
火焰图分析 ; 链路追踪 ; 性能测试
保证可用性和稳定性?
链路梳理 ; 可观测性 ; 全链路测试 ; 稳定性控制 ; 容灾演练
电商介绍
商品:具有交易价值和属性的信息载体
SPU(Standard Product Unit)
SKU(Stock Keeping Unit )
秒杀业务特点:
瞬时流量高
读多写少
实时性要求高
秒杀的挑战
高性能 ;资源成本 ;扩展性 ;防止超卖 ;反欺诈 ; 流量管理 ; 鲁棒性
如何设计秒杀系统
场景(scenario)
功能:
- 秒杀活动发布
- 秒杀商品详情
- 秒杀下单
并发:
- 万人参与秒杀
- QPS(Queries Per Second) 1w+
- TPS(Transactions Per Second) 1k+
存储(Storage)
服务(Service)
子服务:
- 用户服务
- 风控服务
- 活动服务
- 订单服务
基础组件
- ID生成器
- 缓存组件
- MQ组件
- 限流组件
扩展(Scale)
系统架构图
课程实践
秒杀项目流程图
代码整体为common定义一些常量,迭代,结构体,config中为redis的一些配置,controller为SpringBoot中常规则的controller,convertet做数据转化,dao目录为数据操作,entity数据库实体,enums枚举,handler异常处理,limit先六组组件,lock分布式组件,model数据模型层,mq生产者和消费者,service业务逻辑层。
业务逻辑:
1、下单请求上传(用户id,活动id,活动spu id,活动sku id, 数量,价格,总价,收货地址id, 收货地址。)形成一个model,用model完成下面操作。
2、id生成器生成一个活动id,写入数据库,取商品spuid放入set中,查询商品是否存在,校验合法性。
3、扣库存,数据库操作检验于库存大小关系,防止超卖,成功后缓存放入redis
活动详情接口:同样缓存到redis内,先获取id,正常返回数据。
下单接口:首先登录验证(mock),进行校验活动和商品状态,从后端获取秒杀价格,
项目主要优化途径:商品详情缓存到redis内.
今日总结
今天学习了商品秒杀项目的编写,从场景、存储、扩展三个方面来考虑设计电商系统,学习了整体项目的开发和面对秒杀场景下高效率需求的优化,增强了思考业务逻辑的能力。