手把手教你做系统设计 | 青训营笔记

135 阅读3分钟

手把手教你做系统设计 | 青训营笔记

这是我参与「第五届青训营 」笔记创作活动的第10天

今天主要对系统设计进行学习。

一、本堂课重点内容:

本次课程讲了以下几个方面:

1.系统设计方法论

2.电商秒杀系统介绍

3.电商秒杀系统实践

二、详细知识点介绍:

1.系统设计方法论

为什么要做系统设计

就个人而言,做系统设计可以让我们个人能力得到提升,扩展我们的技术视野。就工作而言,对系统进行设计可能是受业务驱动,还可能是出于系统重构,为了突破和创新。针对我们所设计的系统可以有以下几点评估维度:可用性、易用性、可维护性、安全性、性能、耦合性、扩展性、伸缩性等方面。

系统设计的定义: 为了达成某种目的,通过个体组成整体的过程。

如何做系统设计: 我们可以从以下几个层面对系统进行设计

  • 1.场景分析:什么系统,需要什么功能,有多大的并发量。
  • 2.存储设计:数据如何组织,SQL存储,NoSQL存储
  • 3.服务设计:业务功能实现和逻辑整合
  • 4.可扩展性:解决设计缺陷,提高鲁棒性、扩展性 同时,我们还可以使用火焰图分析、链路追踪、性能测试等操作来发现系统的瓶颈。在系统的可用性和稳定性方面,我们有以下几个方面: 可用性和稳定性.png

2.电商秒杀系统介绍

a.电商介绍

商品是指具有交易价值和属性的信息载体。

  • 人(消费者侧):消费者,用户,流量来源
  • 货(供给侧):商品,商家,供应链
  • 场(交易环境):线下商场,线上电商

b.业务秒杀的特点

  • 瞬时流量高
  • 读多写少
  • 实时性要求高

c.秒杀系统还存在着的挑战:

秒杀系统的挑战.png

d.如何设计一个秒杀系统

我们依次从:场景->存储->服务->扩展 对系统进行设计

  • 场景:秒杀系统应该有秒杀活动发布,秒杀商品详情,秒杀下单等功能。要能够承受万人秒杀,QPS大于1w,TPS大于1k。
  • 存储:MySQL数据库做持久,配合Redis数据库进行秒杀,同时使用Localcache进行缓存。下图是MySQL表的关系图。 MySQL表.png
  • 服务:用户服务、风控服务、活动服务、订单服务。同时还需要ID生成器、缓存组件、MQ组件、限流组件。
  • 扩展:在扩展层面,我们需要考虑流量隔离、CDN、缓存优化、流量控制等。 系统架构图 架构图.png

三、实践练习例子(电商秒杀系统实践)

秒杀系统流程图:

秒杀流程图.png

项目目录结构

image.png

项目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");
    }
}

四、课后个人总结:

通过对系统设计的学习,我从中学到了如何进行系统设计以及系统设计的目的是什么。同时,还通过一个电商秒杀系统的实践来加深对其知识点的理解,通过设计一个电商秒杀系统,使我对系统设计有了一个完整的认识,对以后的其他系统设计有着一定的参考意义。