Bootstrap

架构训练营模块二作业

微信朋友圈高性能复杂度

业务指标

【业务复杂度】

朋友圈的业务复杂度较低,只有内容发布、查看、评论及点赞等。

【质量复杂度】

朋友圈的用户非常多,根据张小龙在“2021微信公开课PRO”中的演讲:

每天有10.9亿用户打开微信,3.3亿用户进行视频通话,7.8亿用户进入朋友圈,1.2亿用户发表朋友圈(其中照片6.7亿张,短视频1亿条),3.6亿用户读公众号文章,4亿用户使用小程序。

可知,微信朋友圈的UV约为7.8亿,考虑到大部分人都集中在06:00-24:00时间段进行访问,则得到平均qps为1.2w,再考虑到在某些时间段如吃饭、上下班路上使用朋友圈的情况会相对集中,假设峰值是平均值的5倍,那么高峰期的qps大约为6w。

假设浏览朋友圈的人有一半会点赞,则点赞功能的tps约为3w。

假设点赞朋友圈的人有1/3会发表评论,则评论的tps约为1w。

假设发朋友圈的人与评论的人相当,则发布的tps约为1w。

因此,对于朋友圈的架构设计,关键在于:

所以,需确保其高可用、高性能。

这里我们只讨论其高性能架构设计。

高性能分为计算高性能和存储高性能。

计算高性能分为集群高性能和单机高性能。集群高性能一般通过业务拆分+各拆分业务集群负载均衡实现,(类似中间件集群中的分片+副本机制);单机高性能一般通过各种优化手段实现,如缓存、异步、队列等。

存储高性能也分为集群高性能和单机高性能。集群高性能一般通过关系型数据分库分表(如ShardingJdbc)、NoSQL(如HBase/ES)或分布式存储(FastDFS/云存储(如OSS))实现。单机高性能则一般通过优化SQL来实现。

其整体架构可如下所示:

发朋友圈、浏览朋友圈、点赞朋友圈和评论朋友圈可分别作为一个单独的服务,每个服务部署多个副本实现请求的负载均衡和高可用。

近期图片、视频比较适合缓存在CDN。

存储层内容发布、点赞和评论可分别使用一个单独的库。可使用关系型数据库或NoSQL:关系型数据库如MySQL,可做双主多备、读写分离、分库分表和冷热数据分离;NoSQL如HBase集群。

每个用户有哪些朋友可维护在Redis中。写数据(发朋友圈、点赞朋友圈、评论朋友圈)时可先写Redis Cluster和MQ消息队列,然后异步从队列取数据刷MySQL持久化,这样浏览朋友圈时可直接读Redis。

图片、视频存FastDFS或云存储(如OSS),近期的图片/视频可推到CDN。

可能还需辅以熔断、限流、降级等服务治理手段,如Sentinel。