架构实战营 模块二 如何抓住架构设计的关键点
作业
1. 分析一下微信朋友圈的高性能复杂度
【作业要求】
对照模块 2 讲述的复杂度分析方法,分析微信朋友圈的复杂度;
针对各个复杂度,画出你的架构设计方案(无需做备选方案,只需要最终的方案即可)
给出你的架构方案中关键的设计理由。
3~5 页 PPT 即可,涵盖复杂度分析、架构设计、设计理由。
【提示】
分析过程可以参考模块 2 第 5 课的实战案例,但是不需要将分析过程一一列举出来。
如果某个地方被卡主了,请及时联系助教或者老师讨论。
微信朋友圈功能分析
微信朋友圈大部分功能
由上面的功能列举可见,微信朋友圈是属于功能模块多,业务复杂度高,但是对质量要求并不高的一类应用。所谓质量要求不高,说的是就算朋友圈短时间内不可用 (不能发布,更新,或者发布过程慢),也不会造成非常大的用户影响,甚至影响到用户的留存率。再说大家发布朋友圈,至少也是按照小时为单位,而不是每秒钟都有朋友圈的操作。综上所述,微信朋友圈的总体复杂度的区间图如下:
微信朋友圈数据
高性能高可用的架构设计需要数据的支撑,那么我们就来看看微信朋友圈的一些数据,张小龙在微信公开课上透露的朋友圈用户数据。「从朋友圈这个功能发布至今,每天进朋友圈的人数一直在增长,并且没有下降趋势。」到现在每天有 7.5 亿人进入朋友圈,平均每人要看十几次,所以每天的朋友圈的浏览总量为 100 亿次。
我们来做一个计算,根据微信提供的数据,每天微信的朋友圈的浏览总量为 100 亿次,那么这样就意味着每秒钟的微信朋友圈的浏览量为 10,000,000,000 / 86,400 = 115,740 ~= 120,000
次。假设每次浏览朋友圈都会留言或者点赞,那么留言/点赞的 TPS 和浏览的 TPS 相同。在浏览量的基础上,假设每人每天发一次朋友圈, 那么发朋友圈的 TPS 为 750,000,000 / 86,400 = 8,680
次。综上所述,可以得出下面的假设:
“发朋友圈”高性能分析
首先画出微信发朋友圈的高性能方案。
单机计算高性能
由于朋友圈功能不是一个重新开始设计的一个系统,而是在已有的微信系统上进行的功能增加,做增量开发,所以朋友圈业务基本上是运行在已有的业务服务器上面。现有的模型和框架都可以复用。所以不用考虑单机的计算高性能。
单机存储高性能
由于微信朋友圈的内容包括文字,图片以及视频,所以根据不同的内容,这里需要做分开的存储,图片和视频都要进行压缩处理,然后上传到就近的腾讯的 CND 服务器,然后再更新元数据。这里我们采用关系型数据库,因为用户,文本,图片或是视频之间的关系相对复杂,需要用到关系数据库(B+树)。
集群计算高性能
发朋友圈本身是一个很简单的任务,不需要更多的进行任务分解,直接用负载均衡即可。不需要再把发朋友圈分解成更多的任务。反而是图片和视频的压缩需要时间和计算资源。
集群存储高性能
根据我们的估计,发朋友圈的 TPS 为 9000,不算是一个很大的数值,可以采用关系数据的分片存储。并且当一个用户 A 产生一个朋友圈发布的事件的时候,也会同时产生一个跟该事件相关的发布记录,这个发布记录包含了发布图片的 URL,谁能看到这个图片,图片的大小等等元数据,然后这个记录会被后台批处理的程序推送到这个用户的所有好友的“时间线”的表中。
“看朋友圈”高性能分析
单机计算高性能
同一个道理,进程模型和网络模型不需要考虑。缓存模型需要考虑,因为在刷朋友圈的时间线的时候,已经发生的朋友圈时间是可以放在缓存里面的,不需要重复的去去服务器读取,从而增加服务器的负担。故此可以增加 Redis 的缓存设计。
单机存储高性能
可以采用 Redis List,读取已经存在的朋友圈时间。
1.首先以每个用户的 id 为 key 生成一个 list,list 最好根据需求限制一下长度,毕竟不会有人刷朋友圈的时候会刷到前面几千条数据去吧
2.然后当用户 A 发布内容的时候往关注 A 的用户的 list 里将内容 lpush 进去(因为关注人可能比较多,可以使用异步操作),用户 A 删除内容的时候也将关注人 list 里相对的内容删除
3.当用户要查看朋友圈的时候就返回 redis 里的 list 的数据就行(也支持分页)
4.当用户关注或者取消关注一个人的时候需要清空 list 然后在关系数据库中搜索所有关注人发布的内容并存到 list 里面
集群计算高性能
看朋友圈本身是也是一个很简单的任务,不需要更多的进行任务分解,直接用负载均衡即可。
集群存储高性能
当用户上线的时候,会得到好友的新的朋友圈的发布更新事件,然后微信客户端就会去根据每一个发布事件的元数据去获取图片或者视频在 CDN 上的 URL,把图片或者视频拉到本地。这里只是做任务分配就好,可以采用 Reids Cluster
“评论朋友圈”高性能分析
评论朋友圈包括点赞和回复,其高性能分析和“看朋友圈”的高性能分析差不多。值得一提的是可以在后台准备一张专门的表存储评论和赞的数据,然后当用户刷时间线更新朋友圈的时候,就会同时从评论表里面拉取对应的评论内容。
朋友圈高性能整体架构
版权声明: 本文为 InfoQ 作者【9527】的原创文章。
原文链接:【http://xie.infoq.cn/article/9adba2a4fb07b270fdba5de6d】。文章转载请联系作者。
评论