什么是系统设计?
- 系统设计是一个定义系统架构,模块,接口和数据满足特定需求的过程
- 比如设计一个短网址服务,评论服务,Feed流服务,抢红包系统
- 微服务架构有很多系统被按照业务拆分,需要单独设计系统服务
系统设计
- 需要具备相关领域,算法的经验,有一定架构设计能力
- 熟悉后端计数组件,比如 消息队列 缓存 数据库 框架
- 具备文档撰写,流程图绘制,架构设计,编码实现等功能
系统设计三大要素
- 使用场景和限制条件
- 数据存储设计
- 算法模块设计
按照三要素来回答
- 问面试官:什么场景和条件下使用
- 这个系统是什么地方使用的,比如短网址系统提供给各站各种服务生成短网址
- 限制条件:用过估计多少,至少能支撑多少用户
- 估算qps : 峰值的qps(每秒请求量多少)是多少。平均qps是多少
- 数据存储设计
- 数据库的选型
- 按需求设计表,需要那些字段,使用什么数据类型,数据增长规模
- 数据库选型:是否需要持久化,使用关系型还是Nosql
- 如何优化?如何设计索引?是否可以使用缓存
- 算法模块的设计
- 算法是解决问题的核心, 程序=算法+数据结构 系统=服务+存储
- 需要那些接口,接口如何设计
- 使用什么算法或者模型
- 不同实现方式之间的优劣对比,如何取舍
扩展问题
- 用户多了,qps高了如何处理
- 数据存储多了不够存了如何处理
- 故障如何处理?单点失败,多点失败,雪崩问题
如何设计短网址系统设计与实现?
问题
- 什么是短网址服务?包含那些功能
- 短网址系统的存储设计,需要那些字段
- 如何设计算法生成短网址
什么是短网址服务?
- 把一个长网址转换短网址的服务
- 比如:https://bitly.com/
- 转换之后网址的后缀不超过7位(字符或者数字)
场景和限制:提供短网址服务为公司其他各业务服务
- 功能:一个长网址转换为短网址
- 要求短网址的后缀不超过7位
- 预估峰值插入请求数量级数百,查询量级上千
数据库存储设计
- 根据需求设计数据存储方式
- 使用mysql即可满足
- 需要的字段有那些?
- id
- token (索引)
- url(原网址)
- create add
算法实现设计
设计两个API: long2short_url(把长URL转换为短url), short2long_url(拿短url获取长url)
- 1.md5摘要算法,取前7个字符,但是冲突
- 2.类似于62进制数字,进制0,1,十六进制 0-9 a-f
- 自增序列算法
- 自增id 需要一个计数器 redis incr
mysql 建表语句
1 | create table short_url( |
练习
如何设计一个秒杀系统?
- 难点:如何应对高并发用户请求
- 什么是秒杀系统?你有没有用过
- 如何根据三要素来设计
- 秒杀系统涉及的后端组件