前言

截止到2015年7月,微信每月活跃用户约5.49亿,朋友圈每天的发表量(包括赞和评论)超过10亿,浏览量超过100亿。得益于4G网络的发展,以上数据仍有很快的增长,而且相对于PC互联网时代,移动互联网时代的峰值要来得更加凶猛。比如,2015年元月的流量到了平时的2倍,而峰值则达到了平时峰值的2倍,相当于平时正常流量的5倍,这对整个系统的考验是很残酷的。本次分享将简单介绍微信后台团队的开发模式、微信朋友圈的架构以及在性能上的一些工作,供各位参考。

基本介绍

服务器的配置基本都是普通的服务器,最好的服务器也就是64G内存,这部分占比不多,大部分是32G内存,也有很少一部分8G内存的。硬盘是SSD和SATA都有。CPU以16核居多,有一部分新机器是32核。至于带宽则是比较多的,对外带宽很大。

架构概述

整个微信是微服务的架构,每一个请求后面可能会涉及到几百个服务,每一个服务都有一个QoS,目的是对一些重要的服务进行保证。比如除夕晚上流量达到平时的5倍,这时整个系统的性能肯定不够,所以要优先保证什么呢?优先保证支付,优先保证红包的体验。红包体验保证了,再保证消息,比如点对点两人之间的消息。这两个保证的前提下,再保证群聊。如果群聊也能保证,再保证朋友圈。性能不够时将优先级低的服务暂时停掉,这个过程是不需要人工干预的。

然后到逻辑层。逻辑层包括注册、消息、群聊、朋友圈等等,还有iOS系统的通知。iOS系统跟安卓不一样在于,一个iOS App进入后台之后只有大概15秒的存活期,所以iOS上的推送通知要用API的Push完成,不在接入层做。

再往下走就是存储代理层,这一层主要负责一些关键数据的维护操作,比如用户在账号里面的动作操作和事故信息。存储代理层下面对接KV存储,这个KV存储是不负责业务逻辑的,只是单纯的Key-Value映射,以及负载均衡和容错。(有关KV存储系统的详细说明,可以参考微信架构师许家滔在QCon北京2014上的演讲“微信后台存储架构”。)

涉及朋友圈数据的有四个核心的表:

上面提到过,微信现在每天的发布有10亿多,浏览量超过100亿,对性能的要求很高,所以上面的存储都是做成可以水平扩展的。对于水平扩展的实现,下面举例说明。

应用原理

在发布的表写完之后,会把这个K2的发布索引到小王的相册表里。所以相册表其实是很小的,里面只有索引指针。相册表写好了之后,会触发一个批处理的动作。这个动作就是去跟小王的每个好友说,小王有一个新的发布,请把这个发布插入到每个好友的时间线里面去。

然后比如说现在Mary上朋友圈了,而Mary是小王的一个好友。Mary拉自己的时间线的时候,时间线会告诉到有一个新的发布K2,然后Mary的微信客户端就会去根据K2的元数据去获取图片在CDN上的URL,把图片拉到本地。

在这个过程中,发布是很重的,因为一方面要写一个自己的数据副本,然后还要把这个副本的指针插到所有好友的时间线里面去。如果一个用户有几百个好友的话,这个过程会比较慢一些。这是一个单数据副本写扩散的过程。但是相对应的,读取就很简单了,每一个用户只需要读取自己的时间线表,就这一个动作就行,而不需要去遍历所有好友的相册表。

为什么选择这样一个写扩散的模型?因为读是有很多失败的。一个用户如果要去读两百个好友的相册表,极端情况下可能要去两百个服务器上去问,这个失败的可能性是很大的。但是写失败了就没关系,因为写是可以等待的,写失败了就重新去拷贝,直到插入成功为止。所以这样一个模型可以很大的减少服务的开销。

至于赞和评论的实现,是相对简单的。上面说了微信后台有一个专门的表存储评论和赞的数据,比如Kate是Mary和小王的朋友的话,刷到了K2这一条发布,就会同时从评论表里面拉取对应K2的、Mary留下的评论内容,插入到K2内容的下方。而如果另一个人不是Mary和小王的共同朋友,则不会看到这条评论。

容灾方案

第二个层次的容灾是跨地域的。微信最早在国内有一个上海的数据中心,这个数据中心承载了全国所有的用户。后来有一天上海来了个海啸还是什么的,所有数据都没了,于是后来在深圳又建立一个数据中心,上海服务北方用户,深圳服务南方。后来因为微信发展海外用户,于是在香港建立了第三个数据中心,主要服务东南亚、南亚、中东和非洲。后来在加拿大又建立了第四个数据中心,主要服务美洲和欧洲。

这第二个层次的数据中心跟上面说的园区不太一样。每一个微信用户事实上都属于一个特定的数据中心,比如两个北方的用户,他们的数据都在上海的数据中心,如果说上海数据中心跟其他数据中心的连接断了,这两个用户之间的通信是不会受到影响的。但如果有一个外国朋友在加拿大的数据中心,那么他跟国内用户的通信就可能受到影响。数据中心之间是有专线连接的,但实际上国内到国外的专线渠道并不太有保障,所以专线出问题的时候,两个数据中心之间的数据交换会切换到公网上,走普通的互联网。

新建一个数据中心涉及到很多同步,微信消息的数据同步是通过一个idcqueue组件实现的,是一个异步的数据同步方式。这个异步的写操作可能会由于网络阻塞或者其他原因,慢个一两秒种、几分钟甚至半天,但它会一直重试,能够保持正确性。而对于朋友圈来说,朋友圈是多数据副本的模型,那么多数据副本在跨数据中心同步的时候如何保证正确性,如何保证没有冲突?

当然有关这一块还有很多细节的问题,尤其是因为国内到国外的网络延迟很大,从大陆ping美国可能两百个毫秒,ping阿根廷或者南非可能有四百个毫秒,另外公网的丢包也比较严重,这对于数据同步的实现是很有影响的。这种情况就不适合用TCP了,TCP是针对大带宽、小延迟、有序的环境设计的,所以微信在跨数据中心做数据同步这一块就自己研发了一套类TCP的协议,这种协议对高延迟、高丢包有很高的容忍度,能够做到每秒同步几百兆到上G的数据。另一方面,由于从专线切换到公网存在信息安全隐患,这其中的数据加密也是很重要的一个工作。

公众号推荐:

架构之道:3个程序员成就微信朋友圈日均10亿发布量相关推荐

  1. 后台模拟页面登陆_微信直播小程序后台,微信朋友圈可直达小程序直播了

    独家了解到,微信广告正在测试直播模式,可以帮助商家将直播小程序置于多个广告流量级别,如朋友圈,公众账号和小程序. 这也意味着微信生态系统中的商家不仅可以通过小节目现场直播来运营私有域流量,而且可以利用 ...

  2. “力挺Java!拒绝Python”9万程序员刷爆朋友圈……

    那天,被一个应届生小伙伴问到:第一份工作选Java还是Python好? 我可以说"我认为编程语言永远是工具,用的顺手,选啥都行!" "没有最好,只有最适合自己." ...

  3. 女程序员如何在朋友圈报喜-笑的我肚子疼

    11. 前后端分离开发. 12. 照着文档一步一步做到了最后一步. 13. 最牛叉的代码 14. 当年学C语言的过程. 15. 测试环境一切ok,马上上线 16.千万别乱动老项目 17. 上年纪的前端 ...

  4. 程序员的一往情深朋友圈1

    1.为你编辑快乐的程序,给你安装如意的系统,帮你解开幸福的密码,与你下载好运的软件,程序员节到了,一切准备就绪,愿你程序员节心情无限好,笑口合不拢. 2.滚滚红尘,物欲横流.灯红酒绿,纸醉金迷.不过世 ...

  5. Taro2.* 小程序配置分享微信朋友圈

    if (Taro.getEnv() === Taro.ENV_TYPE.WEAPP) {Taro.showShareMenu({withShareTicket: true,menus: [" ...

  6. 微信小程序踩坑记录 ------- canvas 生成带小程序码的微信朋友圈分享图

    最近做了一个问卷类的小程序,其中的结果页想让用户进行朋友圈分享转发,网上搜索资料,得出解决思路,用 canvas 将页面绘制生成图片,然后保存到手机相册,最终效果如下: 在这里我只写页面里关于 can ...

  7. 小程序编写类似微信朋友圈九宫格布局

    效果图(目前数据都是自己写死的数据 到时是根据api返回显示的) 总共分为 1张图 2张图 4张图 9张图 然后进行对应的样式布局 代码: 根据返回的数组长度进行判断 显示对应布局 例如 arr.le ...

  8. [置顶] 程序员面试之道(《程序员面试笔试宝典》)之程序员如何保持身心健康?

    近期,网上开始流传一个关于程序员的吐槽,道尽了程序员的"悲惨命运",编者将其引用在此.程序员的一生是这个样子的:22岁大学毕业进外包公司,任软件工程师,每天编码到凌晨3点,结果把眼 ...

  9. 重磅消息 |《技术人修炼之道:从程序员到百万高管的72项技能》隆重上市!

    亲爱的读者朋友们,大家期待已久,历时14个月创作的<技术人修炼之道:从程序员到百万高管的72项技能>终于官宣上市了! 许多读者是从我的第一本书<技术管理之巅>(2015年出版) ...

最新文章

  1. tensorflow 教程 梯度下降法实现线性回归问题
  2. android中实现返回首页功能
  3. unix环境高级编程 pdf_UNIX系统编程宝典,每一本都值得程序员珍藏
  4. Rectangle Area
  5. [register]-ARM64重要寄存器介绍
  6. python networkx进行最短路径分析_NetworkX vs Scipy所有最短路径算法
  7. if var matlab,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?
  8. bilstm+crf中文分词_基于LSTM的中文分词模型
  9. bzoj 2653 洛谷 P2839 [国家集训队] middle
  10. 51NOD 1244 莫比乌斯函数之和
  11. 学科竞赛管理系统服务器错误,学科竞赛管理系统.docx
  12. 使用PMSM控制的puma560机械臂简单轨迹跟踪
  13. 我的世界热力膨胀JAVA_我的世界TE4教程热力膨胀能源炉的合成与使用数据
  14. Line 167. parse error, unexpected IS, expecting SEMICOLON ISE14.7
  15. 游戏服务器内三类线程池的划分与使用
  16. linux ping加网址,在运行里输入PING加网址是什么意思
  17. 【大数据】医疗大数据“九大业务应用”相关研究
  18. 转:人最大的教养,是善待父母
  19. fatal: detected dubious ownership in repository at ‘/home/
  20. mysql 军规_Mysql使用军规

热门文章

  1. Swift5中的M_PI
  2. ionic3 打包apk,安装打开后一直停留在启动页面
  3. 养猫日记2022120
  4. 【CSS奇技淫巧】filter drop-shadow 的妙用——处理深色logo适配深色背景
  5. 通过代码生成以太坊助记词、根据钱包地址获取私钥
  6. Python----virtualenv虚拟沙盘
  7. php程序文件免费加密软件,FileWall – 免费实用的文件(夹)加密软件工具!
  8. Java程序员月薪2W除了北上广深杭,如何达到?需要什么掌握能力
  9. OB0205 obsidian 主题修改插件:Style Settings插件使用
  10. 【Matlab】绘制EEG脑电头皮地形图