手把手教你做系统设计 | 青训营笔记
这是我参与「第五届青训营 」笔记创作活动的第10天
今天主要对系统设计进行学习。
一、本堂课重点内容:
本次课程讲了以下几个方面:
1.系统设计方法论
2.电商秒杀系统介绍
3.电商秒杀系统实践
二、详细知识点介绍:
1.系统设计方法论
为什么要做系统设计
就个人而言,做系统设计可以让我们个人能力得到提升,扩展我们的技术视野。就工作而言,对系统进行设计可能是受业务驱动,还可能是出于系统重构,为了突破和创新。针对我们所设计的系统可以有以下几点评估维度:可用性、易用性、可维护性、安全性、性能、耦合性、扩展性、伸缩性等方面。
系统设计的定义: 为了达成某种目的,通过个体组成整体的过程。
如何做系统设计: 我们可以从以下几个层面对系统进行设计
- 1.场景分析:什么系统,需要什么功能,有多大的并发量。
- 2.存储设计:数据如何组织,SQL存储,NoSQL存储
- 3.服务设计:业务功能实现和逻辑整合
- 4.可扩展性:解决设计缺陷,提高鲁棒性、扩展性
同时,我们还可以使用火焰图分析、链路追踪、性能测试等操作来发现系统的瓶颈。在系统的可用性和稳定性方面,我们有以下几个方面:
2.电商秒杀系统介绍
a.电商介绍
商品是指具有交易价值和属性的信息载体。
- 人(消费者侧):消费者,用户,流量来源
- 货(供给侧):商品,商家,供应链
- 场(交易环境):线下商场,线上电商
b.业务秒杀的特点
- 瞬时流量高
- 读多写少
- 实时性要求高
c.秒杀系统还存在着的挑战:
d.如何设计一个秒杀系统
我们依次从:场景->存储->服务->扩展 对系统进行设计
- 场景:秒杀系统应该有秒杀活动发布,秒杀商品详情,秒杀下单等功能。要能够承受万人秒杀,QPS大于1w,TPS大于1k。
- 存储:MySQL数据库做持久,配合Redis数据库进行秒杀,同时使用Localcache进行缓存。下图是MySQL表的关系图。
- 服务:用户服务、风控服务、活动服务、订单服务。同时还需要ID生成器、缓存组件、MQ组件、限流组件。
- 扩展:在扩展层面,我们需要考虑流量隔离、CDN、缓存优化、流量控制等。
系统架构图
三、实践练习例子(电商秒杀系统实践)
秒杀系统流程图:
项目目录结构
项目controller代码
package com.camp.promotion.controller;
import com.camp.promotion.common.ResponseData;
import com.camp.promotion.entity.HCategory;
import com.camp.promotion.entity.HSpecDetail;
import com.camp.promotion.lock.RedisDistributedLock;
import com.camp.promotion.mq.OrderProducer;
import com.camp.promotion.service.HCategoryService;
import com.camp.promotion.service.HSpecDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Controller
@ResponseBody
@RequestMapping("/api/v1/promo/product")
public class CategoryController {
@Resource
private HCategoryService hCategoryService;
@Resource
private HSpecDetailService hSpecDetailService;
@Resource
private OrderProducer orderProducer;
@GetMapping("/list")
public ResponseData<?> listCategory(@RequestParam Long id) {
HCategory category = hCategoryService.queryById(id);
return ResponseData.Success(category);
}
@GetMapping("/all")
public ResponseData<?> queryAll() {
List<HSpecDetail> specDetails = hSpecDetailService.queryAll();
return ResponseData.Success(specDetails);
}
@GetMapping("/test")
public ResponseData<?> testLock() {
try (RedisDistributedLock lock = new RedisDistributedLock("test_key", 10000)) {
if (lock.tryLock()) {
return ResponseData.Success("ok");
}
} catch (Exception e) {
throw new RuntimeException("lock fail");
}
return ResponseData.Success("false");
}
@GetMapping("/mq")
public ResponseData<?> sendMsg() {
orderProducer.send();
return ResponseData.Success("ok");
}
}
四、课后个人总结:
通过对系统设计的学习,我从中学到了如何进行系统设计以及系统设计的目的是什么。同时,还通过一个电商秒杀系统的实践来加深对其知识点的理解,通过设计一个电商秒杀系统,使我对系统设计有了一个完整的认识,对以后的其他系统设计有着一定的参考意义。