这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
Day12——系统设计之秒杀系统
01.系统设计方法论
系统设计的定义
系统:关联的个体,规则的运作,组成工作的整体
设计:设想和计划,目的,过程安排
定义:为了达成某种目的,通过个体组成整体的过程
如何做系统设计
1.场景分析(Scenario) 什么系统,需要哪些功能,多大的并发量
2.存储设计(Storage) 数据如何组织,Sql存储,NoSql存储
3.服务设计(Service) 业务功能实现和逻辑整合 4.可扩展性(Scale) 解决设计缺陷,提高鲁棒性、扩展性
如何发现系统瓶颈
1.火焰图分析
2.链路追踪
3.性能测试
如何保证可用性和稳定性
02.电商秒杀业务介绍
介绍:
商品:具有交易价值和属性的信息载体
秒杀业务的特点:瞬时流量高(比如0点抢购),读多写少,实时性要求高
秒杀的挑战:资源成本,反欺诈(黑灰产),防止超卖(限量商品不能因为抢购而超出售卖量),高性能,流量管控,扩展性,鲁棒性
如何设计秒杀系统
4s分析法:
1.场景
功能: 秒杀活动发布,秒杀商品详情,秒杀下单
并发︰ 万人参与秒杀,QPS 1w+,TPS 1k+
2.存储
Mysql,Redis,Localcache
数据表:
category:类目表,所属第几级,是否是父类,状态
soec:规格表
spec—detail:规格详情表
product:商品表
sku:商品可销售单元,价格,库存
用户表,用户地址表
活动商品表
3.服务
子服务: 用户服务,风控服务,活动服务,订单服务
基础组件: ID生成器,缓存组件,MQ组件(削峰),限流组件
4.扩展
流量隔离 CDN(内容分发网络) 缓存优化 流量管控
数据库扩展 Redis扩展 MQ扩展 服务水平扩展 服务垂直扩展
系统架构图
03.实践
秒杀流程图
目录结构:springboot结构
样例代码过多,此处总结几个开发时的点。
对于对数据库性能压力过大的请求使用缓存起来
收到请求要做数据校验不合法值,在数据库端也要做校验,一些实际数字,比如商品余量不能出现负数,要保证操作的原子性
对于高并发接口要加锁处理。
一些可能是程序瓶颈的优化在不影响功能时可以省去
合理使用lua脚本辅助业务逻辑
开发完成通过接口测试后要进行压测等性能测试