系统设计考点
考点聚焦
系统设计考点
-
什么是系统设计?
-
系统设计需要掌握哪些知识?
-
如何设计和实现一个后端系统服务的设计?
什么是系统设计?(System Design)
系统设计是一个定义系统架构,模块,接口和数据满足特定需求的过程
-
eg: 设计一个短网址服务,评论服务,Feed流系统,抢红包系统
-
eg: 提供一个供其它所有业务使用的一个短网址服务
微服务架构很多系统被按照业务拆分,需要单独设计一个系统服务
-
系统设计的难点
中高级工程师必经之路
-
需要具备相关领域,算法的经验,有一定的架构设计能力
-
熟悉后端技术组件,eg: 消息队列,缓存,数据库,框架
-
具备文档撰写,流程图绘制,架构设计,编码实现等综合能力
系统设计的要素
系统设计三大要素
-
使用场景和限制条件
-
数据存储设计
-
算法模块设计
什么场景和条件下使用?
这个系统是什么地方使用的?
-
eg: 短网址系统提供给站内各种服务生成短网址
限制条件: 用户估计有多少?至少能支撑多少用户(服务)?
估算并发qps:峰值qps是多少?平均qps是多少?(每秒请求量多少?)
设计数据存储系统
数据库的选型
-
按需设计数据表,需要哪些字段,使用什么类型?数据增长规模
-
数据库选型:是否需要持久化?使用关系型还是NoSQL?
-
如何优化?如何设计索引?是否可以使用缓存?
设计算法相关模块
系统=服务+存储
-
需要哪些接口?接口如何设计
-
使用什么算法?或者模型?
-
不同实现方式之间的优劣对比,如何取舍?
如何扩展,容错?
-
用户多了,qps高了如何处理?
-
数据存储多了不够存如何处理?
-
故障如何处理?单点失败,多点失败,雪崩问题
如何设计与实现一个短网址系统?
什么是短网址系统?包含哪些功能(接口)?
短网址系统的存储设计?需要存储哪些字段?
如何设计算法生成短网址?
什么是短网址系统?
TinyUrl Service
把一个长网址转成短网址的服务
转换之后网址的后缀不超过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的设计,算法的设计
-
图文并茂,有数据表,接口定义,流程图
系统设计思考题
如何设计一个秒杀系统
难点:如何应对高并发的用户请求
-
什么是秒杀系统?
-
如何根据提到的三个要素来设计秒杀系统?
-
秒杀系统涉及到哪些后端组件