System Design: Optimization Directions

Underlying Principle: 

1/ Separation makes scalability better. Since you can scale each individually. Example: Separate write and read; separate meta data storage and target content storage. 


2/ 


Cache: 

缓存在这里不再单单指单机的缓存,而是一种基于locality的优化读取机制。缓存不再只存在于操作系统级,而在应用级(浏览器缓存)、单机操作系统级(硬件cache)和分布式系统宏观级(Application server或者web server本地存储,可以指存在server的硬件cache或者server的硬盘)。如果server的硬盘存在数据,那么server不再需要去调用数据库API去获取数据。这与单机级的缓存的一个道理,通过查找local的存储减少通过延时更长的方法去获取数据的。只不过单机级的延时更长选项是硬盘,而分布式系统级的网络。

Distributed Cache: 

利用server的自带存储作为cache的方法称为distributed cache。

分布式系统中,server不止1个,每个server有自己单独的cache + round robin或者random的LB会产生以下现象:某个request在这台机子的缓存可以马上满足,但是它发到另一个server而那个机子需要去调用数据库API。这个问题与Distributed Cache一样,可以通过consistency hash来解决。通过consistency hash知道某一个server是对应某一片数据的。所以当request传送到错误的server时,server可以把request forward到正确的server上去。

Advantage: Easy to scale by adding new nodes to request pool. In other words, easy to increase the cache space. 

Disadvantage: Missing a node would lose a particular part of cache. The particular data part will query from database every time it is requested. A workaround is storing multiple copies of data on different caches of different nodes but this is very complicated.  

Global Cache: 

分布式系统中,经常会使用一个单独的机器作为cache,这种实现是global cache。

Advantage: Unified query. No forwarding. No missing node concern. At the case of fixed dataset of cache or specialized hardware for fast cache, this will be a better choice. 

Disadvantage: overwhelming risk. 

Global Cache 实现方法1:让global cache负责处理cache missing(去数据库拿data)

System Design: Optimization Directions_第1张图片

大部分应用会采用这种,因为这样可以由cache自行管理eviction。

Global Cache 实现方法2:让request的application server去负责处理cache missing(去数据可拿data)

System Design: Optimization Directions_第2张图片

适合采用这种的情况:cache的内容应该是固定的,static的。或者要由别人去管理eviction。当请求的数据巨大,很容易让cache一下就满了,不停的evict会造成不停的missing。让他人决定什么时候evict什么时候不用。

Cache Invalidation: 

If the data is modified in the database, it should be invalidated in the cache, if not, this can cause inconsistent application behavior.

写操作如何更新cache有三种方法:

1、Write through: 同时更新cache和database。最保险。

2、Write around: 只更新database。这样可以让cache不被write request打扰,尤其是更新那些可能不会再被读的数据。断电时候不影响保存更新后的数据。但是,这样让obsolete的数据被读时有cache missing,有很大延时。

3、Write back:只更新cache。更新好了马上返回。过了一段时间之后再更新database。在写集中的时候,降低写的latency。不过有风险会丢失数据。






你可能感兴趣的:(System,Design)