微信朋友圈的高可用复杂度
一、 业务数据量分析
根据微信月活跃人数,初始设定每人每天发布一次朋友圈信息,每 10 条信息设定有 4 次点赞(随机抽样),和大约每 10 条朋友圈有 3 条评论(随机抽样),每个人每天大约能看到当天更新的朋友圈数量均值大约 30 条(随机抽样)。注:微信的合并月活用户数达 12.883 亿【2022 年 5 月 18 日腾讯官方通告】
每天朋友圈的发送数量:12.883 亿 / 30 天 = 4.3 千万条朋友圈/天 TPS = 1000/S(按照白天 80%量)
每天朋友圈的查看数量:12.883 亿 / 30 天 *30 = 12.8 亿条朋友圈/天 QPS = 1.4W/s
每天朋友圈的点赞数量:1.72 千万条/天 TPS = 400/S(按照白天 80%量)
每天朋友圈的评论数量:1.29 千万条/天 TPS = 300/S(按照白天 80%量)
二、设计思路分析
根据整理的业务量数据分析,主要服务有发朋友圈模块、看朋友圈模块、朋友圈的评论、朋友圈的点赞。每一个服务的数据量和访问量都是千万级别,特别是看朋圈这块 QPS 非常高。
(1)数据类型:关系型数据、非关系型数据(图片、视频)、时效性高的数据(点赞),要求设计过程中支持这三种类型的数据。
(2) 数据量:通过业务数据分析,单天的数据总量就已经达到亿级别,做数据更新操作性能会下降很大,如果要提高性能就需要降低单表的数据量,就需要进行分库分表的数据操作。
(3) 每天的用户访问量也较大,需要在网络进入口处进行数据的分流,所以要求提供任务分配器的功能(负载均衡设备)。
三、设计方案
1. 采用现有腾讯云的三地五中心的基础架构【多机房】
全部采用腾讯云的原产品,DNS 路由、CLB(负载设备)、CVM(云服务器)、COS(对象存储)、CDN、TDSQL(分布式数据库)、Redis
非关系型数据存储于 COS、关系型统数据存储于 TDSQL、时效较快使用 Redis(集群模式)
数据量较大采用数据库分库模式处理。具体的实现如下图:
四、设计理由
全部采用腾讯云的云产品进行构建,节省资源,统一管理。
通过腾讯云的 CLB(功能与 F5/nginx 相同),进行任务分配,利用叠加原则提高朋友圈的处理性能。
将朋友圈(发布/查看)定位一个应用服务、评论定位为一个应用服务、点赞定位为一个应用服务。每个应用服务都采用集群模式。
朋友圈数据属于关系型数据+非关系型数据(图片/视频),对于朋友圈文字描述和评论,使用分布式数据库 TDSQL(腾讯本身自研的分布式关系型数据库),非关系型数据(图片/视频)采用对象存储进行存储(腾讯本身自研的云产品 COS 对象存储),点赞数据要求时效性较快,采用 redis 数据库进行存储。
朋友圈和评论数据采的数量基数较大,采用不同的业务库进行存储;针对于朋友圈和评论根据用户的 ID 进行再次分库(以用户地区进行分库,对于用户查询处理上会更加复杂,跨库的查询读会更加复杂)。
朋友圈中查看和发布设置为一个服务,其本身的业务场景较为简单,不建议再次拆分。对于查看要求的数据强一致性不高,可以采用读写分离的模式。即查看通过读数据库,写入通过主数据库。这样提供了数据库的更新性能。
评论