新浪微博应对日访问量百亿级的缓存架构设计

微博日活跃用户1.6亿+,每日访问量达百亿级,面对庞大用户群的海量访问,良好的架构且不断改进的缓存体系具有非常重要的支撑作用 。
本文大纲
1、 微博在运行过程中的数据挑战2、 Feed平台系统架构3、 Cache架构及演进3、 总结与展望数据挑战
新浪微博应对日访问量百亿级的缓存架构设计

文章插图
 
数据挑战
Feed平台系统架构
新浪微博应对日访问量百亿级的缓存架构设计

文章插图
 
Feed平台系统架构
Feed平台系统架构总共分为五层,最上面是端层,比如web端、客户端、大家用的IOS或Android/ target=_blank class=infotextkey>安卓的一些客户端,还有一些开放平台、第三方接入的一些接口;下一层是平台接入层,不同的池子,主要是为了把好的资源集中调配给重要的核心接口,这样遇到突发流量的时候,就有更好的弹性来服务,提高服务稳定性 。再下面是平台服务层,主要是Feed算法、关系等等 。接下来是中间层,通过各种中间介质提供一些服务 。最下面一层就是存储层 。
1、Feed Timeline
新浪微博应对日访问量百亿级的缓存架构设计

文章插图
 
大家日常刷微博的时候,比如在主站或客户端点一下刷新,最新获得了十到十五条微博,这是怎么构建出来的呢?
刷新之后,首先会获得用户的关注关系 。比如他有一千个关注,会把这一千个ID拿到,再根据这一千个UID,拿到每个用户发表的一些微博 。同时会获取这个用户的Inbox,就是他收到的特殊的一些消息,比如分组的一些微博、群的微博、下面的关注关系、关注人的微博列表 。
拿到这一系列微博列表之后进行集合、排序,拿到所需要的那些ID,再对这些ID去取每一条微博ID对应的微博内容 。如果这些微博是转发过来的,它还有一个原微博,会进一步取原微博内容 。通过原微博取用户信息,进一步根据用户的过滤词对这些微博进行过滤,过滤掉用户不想看到的微博 。
根据以上步骤留下的微博,会再进一步来看,用户对这些微博有没有收藏、点赞,做一些flag设置,还会对这些微博各种计数,转发、评论、赞数进行组装,最后才把这十几条微博返回给用户的各种端 。
这样看来,用户一次请求得到的十几条记录,后端服务器大概要对几百甚至几千条数据进行实时组装,再返回给用户,整个过程对Cache体系强度依赖,所以Cache架构设计优劣会直接影响到微博体系表现的好坏 。
2、Feed Cache架构
新浪微博应对日访问量百亿级的缓存架构设计

文章插图
 
接下来我们看一下Cache架构,它主要分为六层 。首先第一层是Inbox,主要是分组的一些微博,然后直接对群主的一些微博 。Inbox比较少,主要是推的方式 。
然后对于第二层的Outbox,每个用户都会发常规的微博,都会在它的Outbox里面去 。根据存的ID数量,实际上分成多个Cache,普通的大概是200多条,如果长的大概是2000条 。
第三层是一些关系,它的关注、粉丝、用户 。
第四层是内容,每一条微博一些内容存在这里 。
第五层就是一些存在性判断,比如某条微博我有没有赞过 。之前有一些明星就说我没有点赞这条微博怎么显示我点赞了,引发了一些新闻 。而这种就是记录,实际上她有在某个时候点赞过但可能忘记了 。
最下面还有比较大的一层——计数,每条微博的评论、转发等计数,还有用户的关注数、粉丝数这些数据 。
Cache架构及演进
1、简单KV数据类型
新浪微博应对日访问量百亿级的缓存架构设计

文章插图
 
接下来我们着重讲一下微博的Cache架构演进过程 。最开始微博上线时,我们是把它作为一个简单的KV数据类型来存储 。我们主要采取哈希分片存储在MC池子里,上线几个月之后发现一些问题:有一些节点机器宕机或是其它原因,大量的请求会穿透Cache层达到DB上去,导致整个请求变慢,甚至DB僵死 。
于是我们很快进行了改造,增加了一个HA层,这样即便Main层出现某些节点宕机情况或者挂掉之后,这些请求会进一步穿透到HA层,不会穿透到DB层 。这样可以保证在任何情况下,整个系统命中率不会降低,系统服务稳定性有了比较大的提升 。
对于这种做法,现在业界用得比较多,然后很多人说我直接用哈希,但这里面也有一些坑 。比如我有一个节点,节点3宕机了,Main把它给摘掉,节点3的一些QA分给其他几个节点,这个业务量还不是很大,穿透DB,DB还可以抗住 。但如果这个节点3恢复了,它又加进来之后,节点3的访问就会回来,稍后节点3因为网络原因或者机器本身的原因,它又宕机了,一些节点3的请求又会分给其他节点 。这个时候就会出现问题,之前分散给其他节点写回来的数据已经没有人更新了,如果它没有被剔除掉就会出现混插数据 。


推荐阅读