title: Notes of System Design No.02 — Design a TinyURL
date: 2022-05-05 13:23:57
tags: 系统设计
categories:
description: " Design a TinyURL"
1.长链接->短链接(写)
2.短链接->长链接(读)
3.可以设置超时时间
4.相同的长链接映射到不同的短链接上
6.短链接应该不可预测
一般系统设计的非功能性指标都会从这几方面来考量
强一致性:系统中的某个数据被成功更新后,
后续任何对该数据的读取操作都将得到更新后的值;
弱一致性:系统中的某个数据被更新后,
后续对该数据的读取操作可能得到更新后的值,
也可能是更改前的值。但经过“不一致时间窗口”这段时间后,
后续对该数据的读取都是更新后的值;
最终一致性:是弱一致性的特殊形式,
存储系统保证在没有新的更新的条件下,
最终所有的访问都是最后更新的值。
在这个系统里面,要求的是强一致性。也就是说每次写请求更新完数据以后,进行读请求立马就能得到更新完的数据
按照以上假设
请求过来以后,负载均衡LB把请求分配到期中的一台App Server。为保证不会单点失败,App Server至少需要三台,因为如果是两台的话 如果其中一台正在升级维护,那么请i去就会全部的发到另外一台机器上 造成那台机器的过载.
Monitor监控每台App Server 的CPU 内存 网络 磁盘等等 ,达到某一个阈值的时候 动态的增加或者减少某一个机器的请求
DB存储长短链接映射的数据。需要对数据做Prtition,每个partition还需要做Replica复制备份,保证高可用
MemCache缓存数据库中产常见数据 减少延迟
App Server中由短链接映射生成长链接(Key Generation)的方式可以有以下几种
1. Random String
随机生成八位的字符串
问题1:不同的AppServer处理相同的长URL的时候有可能会生成相同的字符串
措施2: 可以对不同的App Server 分配一个两位不同的前缀,后六位随机生成。
缺点: 相同的App Server
重复处理相同的长URL的时候 有可能已经生成过了存在数据库里了 这个时候需要先检查数据库,再不断的重新用随机生成算法 直到生成一个不同的字符串
2.MD5
Long URL-->MD5-->128bits number -->base64-->21char string -->Sub string --> 前8 chars strign
如果产生冲突 就在长URL的前面或者后面随机的增加一些字符,重新的走一遍这个过程
Ref:
先用MD5算法 处理原来的长链接 得到128bit的二进制数据
再用Base64编码这个128bit 二进制 ,得到一个大于21个字符的数据
在从这21左右字符里面 挑头6个或者8个作为最终的短链接编码
缺点:和上面一样 如果生成以后 检查数据库发现有冲突 那么就需要重新走一遍流程 再次生成随机串 直到没有冲突 ,增加了延迟
3. 维护一个专门的 Key Generation服务
用来专门生成短URL key
机制:
改进:
4.维护一个全局的计数器
机制:
改进:
不用担心,因为只是损失一部分 损失不大
可以用每秒写的次数/App server的机器数,比如每秒100000writes,有20个App server 则设定的范围可以是 100000/20=5000
不是的 因为在用户发送请求到LB负载均衡的时候,分发到的App server是不确定的。不同的App server维护的计数范围是不同的
要实在担心会出现可预测的问题,可以在App server读取全局计数器生成范围的时候 用洗牌算法 把范围打乱,这样就不会按照顺序依次分配
全局计数器的实现方法:
要保证读写串行化 以及加锁解锁方法 可以用关系型数据库实现。
Zookeeper有分布式的配置管理,可以实现上述的功能需求
对比
只需要一张表 三个字段就可以
关系型数据库和非关系型数据库的比较