设计微博评论的存储系统
设计微博评论的存储系统
设计微博评论的存储系统,要求支持分⻚;微博热门评论,在分页到很深的时候,如何进行优化
估算微博每天的发送量约为 2.5 亿条,假每条微博有 3 条评论。 白天 12 小时内微博的评论总量占比 80%,平均微博评论的 TPS 计算是 2.5 亿*3*80%/(12*3600)≈8K/s。
写微博评论是一个典型的写操作,可以用负载均衡,加上队列。
负载均衡算法选择
写微博评论的时候依赖登录状态,登录状态一般都是保存在分布式缓存中的,因此发微博的时候,将请求发送给任意服务器都可以,这里选择“轮询”或者“随机”算法。
业务服务器数量估算
写微博评论涉及几个关键的处理:内容审核(依赖审核系统)、数据写入存储(依赖存储系统)、数据写入缓存(依赖缓存系统),因此按照一个服务每秒处理 1000 来估算(业务简单),完成 8K/s 的 TPS,需要 10 台服务器,加上一定的预留量,13 台服务器差不多了。
看微博评论是一个典型的读场景,由于微博评论发了后不能修改,因此非常适合用缓存架构,同时由于请求量很大,负载均衡架构也需要。
用户量过亿,应该要用多级负载均衡架构
请求量达到 25 亿,应该要用多级缓存架构,尤其是 CDN 缓存,是缓存设计的核心。
负载均衡算法选择
游客都可以直接看微博评论,因此将请求发送给任意服务器都可以,这里选择“轮询”或者“随机”算法。
业务服务器数量估算
假设 CDN 能够承载 90%的用户流量,那么剩下 10%的读微博评论的请求进入系统,则请求 QPS 为 500K/s*10%=50K/s,由于读取微博评论的处理逻辑比较简单,主要是读缓存系统,因此假设单台业务服务器处理能力是 1000/s,则机器数量为 50 台,按照 20%的预留量,最终机器数量为 60 台。
把最近的100条评论缓存,但只缓存id 然后用KV方法从ID来取出对应的数据 可以利用二级缓存机制,增加本地缓存,热点内容的缓存命中率很高,可以减少90%以上的集中式缓存读取
但这样做,如果用户翻到很深的页,那必然无法命中缓存,穿透数据库,会导致大量的评论请求超时
我们要解决的问题是缓存命中率问题。
比如最高楼层1001,一页20条,第2页数据就是第981-962层的评论
将列表缓存按照固定的楼层分段,比如第1-300层一段,第301-600层一段,依次类推。如果当前最高楼层是1001,则落在901-1200的分段
通过楼层就能知道去取那个分段的列表数据
而且每个分段存储的楼层是固定的。注意是固定的,固定的有什么好处?那就是如果我新来了一条评论,知道他的楼层,那就知道要往那个分段里更新数据,已经满了的分段数据是不会变化的