• 第10章 系统设计考察点


    系统设计考点


    考点聚焦

    系统设计考点

    • 什么是系统设计?

    • 系统设计需要掌握哪些知识?

    • 如何设计和实现一个后端系统服务的设计?


    什么是系统设计?(System Design)

    系统设计是一个定义系统架构,模块,接口和数据满足特定需求的过程

    • eg: 设计一个短网址服务,评论服务,Feed流系统,抢红包系统

    • eg: 提供一个供其它所有业务使用的一个短网址服务

    ​ 微服务架构很多系统被按照业务拆分,需要单独设计一个系统服务

    • 系统设计的难点

      中高级工程师必经之路

    • 需要具备相关领域,算法的经验,有一定的架构设计能力

    • 熟悉后端技术组件,eg: 消息队列,缓存,数据库,框架

    • 具备文档撰写,流程图绘制,架构设计,编码实现等综合能力

    系统设计的要素

    系统设计三大要素

    • 使用场景和限制条件

    • 数据存储设计

    • 算法模块设计

    什么场景和条件下使用?

    这个系统是什么地方使用的?

    • eg: 短网址系统提供给站内各种服务生成短网址

      ​ 限制条件: 用户估计有多少?至少能支撑多少用户(服务)?

      ​ 估算并发qps:峰值qps是多少?平均qps是多少?(每秒请求量多少?)

    设计数据存储系统

    数据库的选型

    • 按需设计数据表,需要哪些字段,使用什么类型?数据增长规模

    • 数据库选型:是否需要持久化?使用关系型还是NoSQL?

    • 如何优化?如何设计索引?是否可以使用缓存?

    设计算法相关模块

    系统=服务+存储

    • 需要哪些接口?接口如何设计

    • 使用什么算法?或者模型?

    • 不同实现方式之间的优劣对比,如何取舍?

    如何扩展,容错?

    • 用户多了,qps高了如何处理?

    • 数据存储多了不够存如何处理?

    • 故障如何处理?单点失败,多点失败,雪崩问题

    如何设计与实现一个短网址系统?

    ​ 什么是短网址系统?包含哪些功能(接口)?

    ​ 短网址系统的存储设计?需要存储哪些字段?

    ​ 如何设计算法生成短网址?


    什么是短网址系统?

    TinyUrl Service

    把一个长网址转成短网址的服务

    eg: https://bitly.com/

    ​ 转换之后网址的后缀不超过7位(字符 or 数字)

    使用场景和限制

    • 使用场景:提供短网址服务为公司其它各业务服务

    • 功能:一个长网址装成短网址并存储,根据短网址还原长URL

    • 要求:短网址的后缀不超过7位(大小写字母和数字)

      ​ 预估峰值插入请求数量级:数百,查询请求数量级:数千

    数据存储设计

    根据需要设计数据存储方式

    • 使用Mysql即可满足

    • 需要的字段有哪些?

    • 如何根据查询设计索引?

    Mysql数据表

    id token(索引) url(原网址) created_at
    1

    算法实现设计?

    短网址生成算法有些?对比优缺点?

    two API: long2short_url, short2long_url

    自增id? -->计数器-->使用redis

    ​ request->redis incr index->encode(index)->save mysql

    #递增序列算法
    def mybin(num): #10进制->2进制
        if num == 0:
            return 0
        res = []
        while num:
            num, rem = divmod(num, 2)   # 2 -> 62
            res.append(str(rem))
        return ''.join(reversed(res))
    
    print(mybin(10))
    
    CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    
    def encode(num):
        if num == 0:
            return CHARS[0]
        res = []
        while num:
            num, rem = divmod(num, len(CHARS)) #62
            res.append(CHARS[rem])
        return ''.join(reversed(res))
    
    print(encode(1))
    print(encode(61))
    

    回答重点

    遵守三个要素来回答

    • 包含数据表的设计,api的设计,算法的设计

    • 图文并茂,有数据表,接口定义,流程图


    系统设计思考题

    如何设计一个秒杀系统

    难点:如何应对高并发的用户请求

    • 什么是秒杀系统?

    • 如何根据提到的三个要素来设计秒杀系统?

    • 秒杀系统涉及到哪些后端组件

  • 相关阅读:
    mysql数据库函数 concat 字段类型转化、字段拼接
    SSH2中的No result defined for action的问题
    导致表单重复提交(两次)的原因--css{url()}与a标签
    详解jar命令打包生成双击即可运行的Java程序
    21IO流 和缓冲流 和处理流
    20File
    19(1)hashmap,hashtable
    IntelliJ IDEA注册码激活
    19映射
    18泛型
  • 原文地址:https://www.cnblogs.com/xzpin/p/11619255.html
Copyright © 2020-2023  润新知