系统设计与实践
系统设计介绍
短URL设计
设计一个系统把用户提供的URL转换为短的URL,访问的时候要跳回到原始的URL,在系统设计的面试里,如何评价一个系统设计,一分到四分
第一级:
设计一个数据库来映射关系,从短URL到原始的URL。
有哪些不好的地方?
从原始的URL返回一个5位的编码,不是五位的用0补充。
能不能扩充,返回的ID为什么都是0到9?
在Cache里面搜索,Read/Write rate LRU和LFU
第二级:
Key-Value DB
MySQL is slow
Key-Value模型做了很多简化,提升了性能,是MySQL的10倍以上
有没有其他办法产生呢?
URL->md5(128bits)
Base64->6bits
Truncate(md5(URL), 5)
第三级:
考虑到扩展性和可靠性
Multiple Servers(Memcache/DB)
Sharding: hash(URL) % N = Server ID
Standby
Reliability
Replica(cross region, master slave)
Recovery(master: checkpoints, slave:recreate)
Consistency:一致性,在分布式当中,某一个节点还没有同步完成,从A和B中读出来有误差
第四级:
从chunk中分到一个cluster,id generator(zookeeper)
怎么避免URL被重复地访问和爬虫(有些网站不想要被爬取),可以在内部把字符串打乱
怎么限制单一用户RPS,strategy?
流量控制
怎么实现重定向的思路?
速率限制:可以用memcache,key是IP,Username/Email, UserId(logged in)
Reak key in memcache: key+timestamp(inminute)
Value:counter
Expiration:/m,/h,/d
Memcache内存
Redis内存+磁盘,定时从内存flush
Nosqul database
Sql database
Ratelimit
使用cache带上过期销毁信息,一个小时后销毁,但算法会出错
系统设计七剑客:
同步
网络
数据库
分布式
性能
估算
面向对象
案例-社交网络信息流
日志统计
网络爬虫
电商产品页面
concurrency
thread vs. process
consumer and producer
blockingqueue
tracking:
synchronized, asynchronized
操作系统里面程序运行的系统单位,一个程序至少有一个进程,一个进程至少有一个线程,进程的划分比较小,一个进程有独立的内存单位,但多个线程可以共享内存,每一个独立的线程有入口,序列和程序的出口,操作系统会用进程的调度管理来分配,进程是数据集合上的活动,是系统实现调度的单位
生产者和消费者:
有限的缓冲问题,多线程同步问题的案例,主要描述了两个共享缓冲区的线程,一个叫consumer,一个叫producer,生产者生产一定数据到缓冲区,消费者负责消费,生产者不会在缓冲区满的时候加入,消费者不会在空的时候的消费
blockingqueue
给定了一个queue的结构,普通的queue先入先出,但空的时候要等待,满的时候不能push,queue的基本操作,有move和add,有maxSize,,如果有两个同时去操作的话,有保护,在函数起始位置有lock,末尾有unlock.当queue是空的时候,que就一直在等待,
tracking相关的,记录一个事件是不是被记录下来,
两种做法一种是同步的,一种是异步的,当你去访问一个服务的时候是一个get请求,异步的方式,放入缓冲区,做一种积累,log aggregator,每隔一段时间去刷新到磁盘上面,好处是一方面降低系统复杂度,另一方面可以加一些实时的分析系统。
网络结构
OSI
Application layer
Presentation layer
Session layer
Transport layer
Networklayer
Data link layer
Physical layer
在头部会加一些mate data
应用层有HTTP协议,1.1
传输层:TCP,UDP
网络层IP
TCP是一个可靠的稳定的链接,UDP不太可靠,到物理层会通过路由传输到另外一台机子上去,然后会一层层往上解压
Visit URL
当你输入一个URL后发生了哪些事情
先要链接到远端的服务器,然后发送请求到服务器,寻址和建立链接,首先你要做一个寻址,如果浏览器中存在URL的IP,就直接访问,否则要访问DNS,寻址加上域名找到IP,域名是一个分层的结果,顶级域名,DNS会返回服务器的地址,第三步就是浏览器会建立三次握手建立TCP的链接,网页服务默认端口是80端口,第四部是浏览器和服务器的会话,接受数据,第五步是浏览器解析数据并渲染展示网页,浏览器关闭的时候会终止对话并把链接关闭。
数据库Database
relational DB vs. Key value store
sharding vs. clustering
以前关联是主流,结构化和数据模型,交易的安全性要求非常高
KV store在很多社交网站,发了很多信息是对象的存储,是一个静态的过程,不需要做很多关联。
分片和集群的比较,一台数据库的容量有限,单个表的承受在一千万左右,超过一千万实现的性能比较差,需要拿到更大的数据量需要拆表,垂直拆和水平拆,取摸然后分配到不同的机器上面去,第二种是clustering,是一个自动管理的东西,会自动维护,有协调者,知道哪个服务器的复杂量的高低,每次先访问协调者,然后返回一个服务器地址。
听起来很好,加一台数据库会告诉你,在真正的工业中sharding更多一点,算法设计不好的话本来负荷就很高,给更多的压力,一旦发现问题的话sharding能做问题的定位和处理,在做tinyURL的时候也用到了数据库的结构,怎么拿到code,url, created_at,要加一个索引。
分布式
怎么规模化tinyurl,一个是对于前段的服务可以用load balancer,给前端服务做均衡,当某一台机器做了一个转移之后还能做
第二个是把服务器sharding化。
第三步提高性能,每一层都可以加一些cache,相当于把读的请求给缓存住,大大减轻服务器的压力。
然后对写的流量也要给做一个平衡化。
原来只能写到集中一台的对象,现在能写到某一个服务器上的数据库。
如何做一个tracking可以在本地做一个缓冲,异步刷新到message queue上去。
Performance性能
Numbers evetyone should know
访问效率,cache 0.5ns
硬盘千万纳秒级
闪存,寿命比磁盘小一些,比较适合做随机,磁盘适合做顺序
Estimation
全世界范围内有多少调音师
tinyURL总的存储大小
URL长度10-1000字符
设计模式
MVC,网络系统中,后端数据叫模型层,前段叫View,中间叫Controller
Singleton只有一个实例,能使用一些方式来初始化这个实例
Factory
Iterator
Decorator
Façade
案例
news feeds
stats server
web crawler
amazon product page