华仔训练营第二次作业
分析一下微信朋友圈的高性能复杂度
首先从百度获取数据:
截止到 2015 年 7 月,微信每月活跃用户约 5.49 亿,朋友圈每天的发表量(包括赞和评论)超过 10 亿,浏览量超过 100 亿,除夕晚上流量达到平时的 5 倍
1.访问量
平均 TPS:1000000000/24/3600=11574
平均 QPS:10000000000/24/3600=115740
峰值 TPS/QPS*5=57870/578700
使用微服务集群支持,高峰时段进行临时水平扩容
2.朋友圈内容包含文字、图片、小视频等,接入方案为上传文件至腾讯的 CDN 服务器
3.发布内容需要控制可见范围、可见时间、提醒某人查看、提示我的好友有朋友圈更新,涉及读取用户通讯录
方案:
1.前端负载均衡使用 F5 分配上传、发布、查看的服务,同时在每个服务集群也增加 F5 负载均衡,因为量大,使用 F5 可以更有效的提升性能
2.文件服务集群针对上载的图片、小视频等内容,按照地域分别上载至 CDN 服务器,并返回文件在 CDN 服务器上的 url
3.发布朋友圈服务集群,将朋友圈信息写入腾讯自研高性能数据库 HTAP,读写分离;
按照朋友群消息设置的时间、可见范围、提醒谁看等选项,调用用户信息微服务,获取客户的通讯录,按照通讯录好友列表,推送更新通知至消息队列。
朋友圈的数据库要和客户服务的数据库隔离,仅通过服务调用方式获取,避免影响微信的核心聊天功能。
完成新增朋友圈信息落库后,数据库信息同步至缓存。由于文件都存在 CDN 上,因此朋友圈信息文字+链接的内容很小,因此使用缓存存储朋友圈信息。
缓存使用高版本的 redis cluster,保证容量、复制、数据同步高效。
4.查看朋友圈服务监听消息队列,接收到新消息则告知客户端有更新。用户查看朋友圈时,从缓存中读取对应朋友圈消息,并按照 url 从 CDN 服务器上读取文件。
5.点赞等服务也在发布朋友圈服务集群中。由于点赞是可以取消且实时性要求不高,因此点赞信息和朋友圈信息分表存放,使用批量更新的方式新增/删除点赞信息,同样使用消息队列推送更新通知。
6.后台管理服务维护缓存内容,淘汰一定时间范围外的数据,例如一月前的数据或用户设置 3 天可见,则删除 3 天前的数据。同时后台管理服务还需要监控数据库同步失败的数据,手动同步到缓存内。
7.在节假日节点,可以使用水平扩容的方式增加文件、发布集群服务器;降低推送更新通知频率,减轻服务负载,有限保证红包、聊天等核心业务的工作
架构图:
评论