系统设计
如何做系统设计
- 场景分析 ( Scenario ) 什么系统,需要哪些功能,多大的并发量
- 存储设计 ( Storage ) 数据如何组织,Sql存储,NoSql存储
- 服务设计 ( Service ) 业务功能实现和逻辑整合
- 可扩展性( Scale ) 解决设计缺陷,提高鲁棒性、扩展性
如何发现系统瓶颈
火焰图分析,链路追踪,性能测试
存储设计(三级存储)
MysQL -> Redis -> Localcache
- MySQL
- 安装MySQL,推荐使用MySQL8及以上版本
- 熟悉ddl,dml等基础语法
- 了解sql优化
- Redis
- 安装Redis,推荐最新版本
- 了解Redis的基本数据类型和使用场景
- 熟悉常用命令
- 了解Lua脚本的使用
- 了解Redis分布式锁
服务
子服务:用户服务,风控服务,活动服务,订单服务 基础组件:ID生成器,缓存组件,MQ组件,限流组件
代码实践
- 流程图
- 基本概念
- Spu
- Sku
- 秒杀业务的特点
- 秒杀的挑战
- 资源有限性
- 反欺诈
- 高性能
- 防止超卖
- 流量管控
- 扩展性
- 鲁棒性
- 代码分析
PromotionController.java 创建活动业务
java
复制代码
@PostMapping("/activity")
@RateLimit(rate = RateEnum.RATE_100_PER_SECONDS)
public ResponseData<?> createPromoActivity(@RequestBody CreateActivityRequest createActivityRequest) {
Long start = createActivityRequest.getStartTime();
Long end = createActivityRequest.getEndTime();
if (start > end || System.currentTimeMillis() > start) {
throw new BizException(ResponseEnum.ILLEGAL_ARGUMENT);
}
if (CollectionUtils.isEmpty(createActivityRequest.getPromoProducts())) {
throw new BizException(ResponseEnum.ILLEGAL_ARGUMENT);
}
CreateActivityModel model = createActivityRequest.convert(PromoConverter::convertCreateActivityModel);
List<CreatePromoProductModel> promoProductModels = hPromotionService.CreatePromoActivity(model);
return ResponseData.Success(promoProductModels);
}
首先获得活动的起始时间和结束时间,如果开始时间大于结束时间或者当下时间大于开始时间,就返回非法信息,如果活动的折扣商品信息为空,也返回非法信息。
用PromoConverter的convertCreateActivityModel方法将活动CreateActivityRequest类型整合成CreateActivityModel类型,传入HPromotionService的CreatePromoActivity方法,最后返回是否成功开启活动的信息。