0.评判

1.Level1.0 Base Design



1的十次方 1K
1的二十次方 1M
1的三十次方 1G 大概是10亿的量级
1的三十二次方 4G
设计的时候要明白read和write谁多一些?
一般在url中读的会比写的多.
如果加上cache的话,就可以大幅度提高读写效率.
两种不同的淘汰策略.
LRU--是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的
页面予以淘汰.
LFU--LFU(least frequently used (LFU) page-replacement algorithm),即最不经常使用页置换算法,
要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数.但是有些页在开始
时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一
位,形成指数衰减的平均使用次数.
2.Level 2.0 Performance

base64相当于2的6次方,是6bits,128bits如果以Base64作为编码的话,需要大概21个字节,
现在要求用5个字节,简单做法就是取前五个字节或者后五个字节,那么新问题就是说:如何
解决碰撞问题?系统需要在速度,内存和冲突之间做权衡.
3.Level 3.0 Scalability&Reliability

扩展性和可靠性这方面的问题,举个例子:
一台机器如果不稳定的话会造成单机故障,能否使用多台机器呢?
可扩展性:
(1)多台机器在前端和数据库层都可以加上很多节点,所以这里可以对Memcache和DB多来几台机器.
需要进行sharding(切分),可以对URL先取一个哈希,哈希之后再对N取模,取模目的就是把数据
分配到某一台机器上去,取模的结果就是那台服务器的ID,就是一个index;
(2)第二个做法就是对热门的数据库服务器做一个热备份,当数据再来的时候可以引到热备份的数据
库对应的那台机器上去,也就是hotstandby,在旁边守候.
可靠性:
(1)需要做到一些备份,最简单的就是主从模式,master负责写,slave负责读,这个是一个非常经典的
分布式方案,备份的目的就是把master节点上的数据一个个同步到slave节点上去;
(2)如果出现问题,如何做恢复?
一般来说会写一个日志性的信息追加到操作日志中去,日志中可以记录checkpoint(检查点),在
checkpoint之前的东西相当于做了一个备案,恢复的时候先找到离它最近的那个检查点,然后在
chechpoint之后再一步步地做恢复操作,如果是slave机器挂了,这个就比较容易处理,把slave
重新拷贝一遍,就可以拿到原始的信息.
(3)一致性如何保证?
在分布式当中,当一个数据还没有同步完成,A和B节点之间的状态可能就会不一样,如何用更好的
方式来保证一致性呢?提出了最终一致性,强一致性的检查.
4.Level 4.0 Super Star






1.对ID的分配值,第一个根据数据库的方式,第二个根据MD5的方式,有没有更好一些更泛化的方式呢?
这里专门有一个服务叫做IDGenerator,它能够通过chunk来分配它的ID,在这当中有一个集中的协调
者,这个协调者是通过zookeeper来实现的.
2.避免URL被重复地访问或者爬取,因为url都对应着资源,网站不希望把对应的资源都暴露给外面,
那么如何避免呢?可以把字符串打乱,内部建立一个表,比如说a对应15,b对应着23,原始的1
对应的是72,这样在拿到原始的url的时候将外部的ID换成内部的ID,所以这个是一种方案,这也是
一种很有名的编码方式叫做凯撒编码.凯撒编码相对来说更容易,仅仅是把A-Z中的某一段挪到最前面,
假如说现在X开头,那么此时就是X对应着A,Y对应着B.
3.如何控制单个用户访问的次数?
说我们下面要提到的流量的控制.
4.如何实现一个重定向的server?
因为有些人可能会从头开始搭建一个重定向的服务,比如说先拿到一个短的URL,然后做一个http封装,
在后端取到原始的URL,然后再把服务器送回去,通过服务器这样的socket接口,再返回.但是如果使用
apache或者一些高级的webserver的话,就是一个默认的重定向模块,就不用从头开始发明轮子.
流量控制的具体实现:
Ratelimit是说对一些访问的请求要设一些黑名单或者权限的控制,比如说一分钟之内访问10次,1小时内
访问100次,一天只内访问1000次等这样的规则,我们可以想一想一些比较直观的做法,这里说的是Memcache,
把一些需要信息放到Memcache中,key是什么呢?要根据什么规则做一个拦截,也许是注册的IP,也许是姓名
或者email,也可能是userid,在Memcache中用Key+timestamp来找出对应的value,然后可能设置的好几个
不同的粒度,可能还要对timestamp进行一定的处理,这样的话,每次来一个请求就用键去查值,循环三次(
分钟,小时,天数各一次),最后去发现告警是不是触发了这样一个规则.
5.插播

6.相关链接
ref1