微博评论高性能高可用计算架构
1、计算性能预估
数据参考
用户量估算 - 2020.9 月月活 5.11 亿,日活 2.24 亿(参考《微博 2020 用户发展报告》)
发微博
假设平均每天每人发 1 条微博(只考虑文字微博),则微博每天的发送量约为 2.5 亿条。
发微博集中在早上 8:00~9:00 点,中午 12:00~13:00,晚上 20:00~22:00,假设这几个时间段发微博总量占比为 60%,则这 4 个小时的平均发微博的 TPS 计算如下:2.5 亿 * 60% / (4 * 3600) ≈ 10 K/s。
看微博
由于绝大部分微博用户看微博的对象是大 V 和明星,因此我们假设平均一条微博观看人数有 100 次,则观看微博的次数为: 2.5 亿 * 100 = 250 亿。
大部分人看微博的时间段和发微博的时间段基本重合,因此看微博的平均 QPS 计算如下:
250 亿 * 60% / (4*3600) = 1000K/s。
用户行为建模和性能估算
【发评论】
假设看微博之后会有百分之一的人去写评论,则发评论的次数为: 250 亿 /100 = 2.5 亿条 。
发评论的时间也按 4 小时重合计算,发评论的 TPS 计算如下
2.5 亿 * 60% / (4 * 3600) ≈ 10 K/s。
【看评论】
大部分人不会在意别人的评论而是会比较关注自己的评论,假设平均一条评论观看人数为 10,则观看评论的次数为:2.5 亿 * 10 = 25 亿 。
以此类推,看评论的 QPS 为:
25 亿 * 60% / (4*3600) = 100K/s。
发评论分析
【业务特性分析】
发评论是写操作,不用缓存,用负载均衡;另参考华仔课程建议此处可以使用写缓冲应对突发流量。
【架构分析】
用户量过亿,应该要用多级负载均衡架构,覆盖 DNS -> F5 -> Nginx -> 网关的多级负载均衡。
【架构设计】
负载均衡算法选择
发评论的条件和环境基本和发微博一致;因此发评论时,将请求发送给任意服务器都可以,这里选择“轮询”或者“随机”算法。
业务服务器数量估算
同样参考发微博,发评论按照一个服务每秒处理 500 来估算,完成 10K/s 的 TPS,需要 20 台服务器,加上一定的预留量,25 台服务器差不多了。
看评论分析
【业务特性分析】
看评论页是一个读场景,评论发了后不能修改,因此非常适合用缓存架构,同时由于请求量很大,负载均衡架构也需要。
【架构分析】
用户量过亿,应该要用多级负载均衡架构;
请求量达到 25 亿,应该要用多级缓存架构(5 级缓存),尤其是 CDN 缓存,是缓存设计的核心。
【架构设计】
1.负载均衡算法选择游客都可以直接看微博,因此将请求发送给任意服务器都可以,这里选择“轮询”或者“随机”算法。
2. 业务服务器数量估算假设 CDN 能够承载 90%的用户流量,那么剩下 10%的读请求进入系统,则请求 QPS 为 100K/s * 10% = 10K/s,由于读取微博的处理逻辑比较简单,主要是读缓存系统,因此假设单台业务服务器处理能力是 1000/s,则机器数量为 10 台,按照 20%的预留量,最终机器数量为 12 台。
2、非热点事件高性能计算架构
写评论和读评论无需拆分为单独的服务
高性能计算方案
多级负载整体方案
3、热点事件时高可用计算架构
用户行为建模和性能估算
热点事件一般会引发很多人的关注度,大多数用户可能会参与到事件的讨论中,发表自己的观点,对系统会造成较大的冲击,容易造成雪崩。因为事件的影响力和范围无法评估,对于请求量可能无法提前预估
读写评论特性分析
【业务特性分析】
很多人会发表自己的想法,但是发完之后可能很快评论就淹没了,可能自己都看不到,所以写评论的时效性要求并不高
【架构分析】
限流:对于热点事件的讨论是所有用户可能都想参与的,这里尽量不采用限流手段
排队:由于写评论时效性要求不高,可采用队列异步处理请求
动态扩容:可以通过监控系统流量来实现应用的动态扩缩容应对请求突然的请求
【架构设计】
排队:利用 Kafka 消息堆积能力,将请求堆积下来,客户端异步查询写评论相应结果
缓存:同时使用本地缓存,可以确保自己发的评论自己第一时间是看得到的
动态扩缩容:配合监控系统和扩缩容策略
评论