灰度、灰度、再灰度

在变更后的部署方式上,微信在一些规则会限定不能一次把所有的逻辑变更上去,每一次变更一小点观察到每一个环节没有问题的时候,才能布局到全网上去。微信后台每一天可以支撑超过20个后台变更,在业界来说,通常做到5个已经是比较快了,但是微信可以做到快4倍。

腾讯内部的上线系统

而所谓灰度发布,是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面 来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。(在腾讯,灰度发布是最常采用的发布方式之一)

孙子兵法:古之所谓善战者,胜于易胜者也

常识上,解决一个复杂问题的时候,会用高明的技巧解决复杂的问题,这个不是微信团队的目标,他们追求的要做到让所有问题很自然和简单的方式解决掉。在周颢看来,微信架构的技术复杂点在四个要点:协议、容灾、轻重、监控。

微信架构

协议。手机终端跟后台服务器之间的交互协议,这个协议的设计是整个系统的骨架,在这一点做好设计可以使得系统的复杂度大大降低。容灾。当系统出现了若干服务器或若干支架(宕机的时候),仍然需要让系统尽可能的提供正常的服务。轻重。如何在系统架构中分布功能,在哪一个点实现哪一个功能,代表系统中间的功能配置。监控。为系统提供一个智能仪表盘。

在协议设计上,移动互联网和常规互联网有很大的区别。首先有CMWAP和CMNET的不同,在中国现在有相当多的手机用户使用WMWAP连接,还有就是在线和离线的概念,当QQ下线的时候叫离线,当你登录的时候叫在线。但是在移动互联网这两个概念比较模糊。从微信的设计中,不管在线还是离线系统表现都应该是一致的。还有一个是连接不稳定的问题,由于手机信号强弱的变化,当时信号很好,5秒钟走到信号不好的地区,连接就必须断掉。这个中间带来不稳定的因素为协议设计带来较大困难。此外就是资费敏感的问题,因为移动互联网是按照流量计费的,这个计费会使得在协议设计中如何最小化传输的问题。最后就是高延迟的问题。

对此,业界标准的解决方案:Messaging And Presence Protocol:1)XMPP;2)SIP/SIMPLE。它的优点是简单,大量开源实现。而缺点同样明显:1)流量大:状态初始化;2)消息不可靠。

微信在系统中做了特殊设计,叫SYNC协议,是参考Activesyec来实现的。特点首先是基于状态同步的协议,假定说收发消息本身是状态同步的过程,假定终端和服务器状态已经被迟了,在服务器端收到最新的消息,当客户端、终端向服务器对接的时候,收取消息的过程实际上可以简单的归纳为状态同步的过程,收消息以及收取你好友状态更新都是相同的。在这样的模式之下,我们会也许会把交互的模式统一化,只需要推送一个消息到达的通知就可以了,终端收到这个通知就来做消息的同步。在这样的简化模式之下,安卓和塞班都可以得到统一。这样的系统本身的实现是更为复杂的,但是获得很多额外的好处。

让剩下系统实现的部分更加简单,简化了交互模式,状态同步可以通过状态同步的差值获得最小的数据变更,通过增量的传输得到最小的数据传输量。通过这样的协议设计,微信可以确保消息是稳定到达的,而且是按序到达。引用一句俗话:比它炫的没它简单,比它简单的没它快,没谁比他更快,哪怕在GPRS下,微信也能把进度条轻易推到底。

追求完美设计的团队不能胜任海量服务

在容灾之前面向最坏的思考,如果系统真的挂了,需要做一些事情,首先是防止雪崩,避免蝴蝶效应。如果关注春节订火车票就知道了,用户的请求量会因为系统服务不了而不断的重试,意味着发生雪崩的时候,系统可能会承载原先3-10倍的流量,使得所有的事情更加恶化。所以微信有很多“放雪”功能的设计。第二个词是柔性可用,在任何的系统中不要追求完美设计,追求完美设计的是团队是不能胜任海量服务的。如果在一个系统出现问题的时候,这个系统就挂了,那么这是一个不好的设计,最好的做法是提供0-1中间的选择。举一个例子,当一个用户向另外一个用户发消息的时候,可能会通过一个垃圾信息过滤的检测,如果垃圾信息过滤这个模块突然挂掉了,这个消息难道就不能达到了吗?在这样的情况下,要忽略掉这个错误,使得消息正常达到对方。要精确定位出哪一个环节是最为重要的,把不是重要的错误尽可能的忽略掉。当不能做到完美的时候,尽可能为用户提供服务。另外一个重要方面叫做“保护点前置”,最前的一个点就是终端,在手机终端上蕴埋更多的保护点,这样会为用户系统赢得更大的处理空间。如果终端具备这样的能力,会获得更大的反应空间。

周颢介绍了在微信上具体容灾设计的做法。在所有的容灾中存储层的容灾是最难的,一个系统的设计分为三层:接入层、逻辑层、存储层。接入层和逻辑层的容灾都有比较成熟的方案。逻辑层的容灾相对来说比较简单,尽量不要有状态的设计,比如说当你做上一个请求的时候,会保持一些状态,要使得下一个请求发到下一个服务器。如果任何一个请求之间互相不关联的话,这个就是无状态的设计,只要做到这一点逻辑层的容灾可以随意的切换。在回到存储层本身的容灾设计上,相对来说困难一些,但是微信研发团队采用了一些技巧,叫分而治之,分离业务场景,寻求简单的设计,并不会寻求大而同一的解决方案,因为这样会使得系统的复杂度大幅度上升,而微信会尽可能把产品拆细,寻求简化的设计。

首先是主备容灾,这是最常见的方案。在有一些业务场景中是可以容忍最终一致性的,比如账号系统的设计,每天写入账号系统的请求是非常少的,但是访问的请求非常多,这个差异可能会达到数万倍的规模,在这样的场景下,微信会在账号系统中采用简化的方案,也可以获得比较大的稳定度。

SET模型+双写

第二种容灾的模式叫双写,两台Master的机器,当一台机故障的时候,另外一台机还是可以接收到写请求,当两台机交错启动的时候,会得到数据的丢失。但是有一些场景是可以容忍轻度数据丢失的,比如说会有一个存储专门记录用户终端的类型,比如说安卓还是塞班以及他们使用终端的微信版本是什么,这样的数据是可以容忍轻度数据丢失的,因为偶尔有一些丢失的话,下一次访问会把这些数据带上来,会尽快的修复所有的数据。双写也是非常简单的模式。

微信的研发团队做了一个叫Simple Quorum的机制,在微信的后台中,同步协议有一个很重要的基石叫序列发生器,这样的一个序列发生器需要有极高的稳定度。首先可以看到序列号有一个特点永远是递增的,用递增方式往前推进的时候,最大的序列号就是最新的系列号。有一个毕业才加入广研的毕业生想到一个绝佳的方案,按SET分布,从2G减到200K。

微信 服务器架构,微信技术总监周颢:一亿用户背后架构秘密相关推荐

  1. 微信技术总监:一亿用户背后的架构秘密

    点击上方"阿拉奇学Java",选择"置顶或者星标"  每天早晨00点00分, 与你相约! 来自:CSDN.腾讯科技.虎嗅 | 责编:乐乐 往日回顾:如何从 Wi ...

  2. 一亿用户背后架构的秘密

    周颢,2001年毕业于华南理工大学,计算机专业硕士.2005年加入腾讯广州研发部,历任QQ邮箱架构师,广研技术总监,T4技术专家,微信中心助理总经理. 腾讯广研助理总经理.微信技术总监 周颢 CSDN ...

  3. 腾讯微信技术总监:十亿用户增长背后的架构秘密

    微信--腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿...   在技术架构上,微信是如何做到的 ...

  4. 腾讯微信技术总监周颢:一亿用户增长背后的架构秘密

    [CSDN.NET专稿 付江/文] 微信--腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿... ...

  5. 腾讯总监周颢:亿级用户微信采用的架构宝典

    微信--腾讯战略级产品,创造移动互联网增速记录,10个月5000万手机用户,433天之内完成用户数从零到一亿的增长过程,千万级用户同时在线,摇一摇每天次数过亿... 在技术架构上,微信是如何做到的? ...

  6. 微信技术总监:11亿日活的超大型系统架构之道!13页ppt详解!

    公众号回复'架构'获取架构师电子书及视频课程 点击下方图标关注公众号IT架构师联盟获取更多专业内容 微信的成功归结于腾讯式的"三位一体"策略:即产品精准.项目敏捷.技术支撑.微信的 ...

  7. 微信技术总监:11亿日活的超大型系统架构之道!13页ppt详解

    点击"技术领导力"关注∆  每天早上8:30推送 作者| 周颢    整理| Mr.K 来源| 技术领导力(ID:jishulingdaoli) 作者,微信技术总监 周颢,2001 ...

  8. 微信一亿用户背后的架构秘密

    敏捷是一种态度,敏捷就是试错 微 信研发团队里鼓励一种试错的信仰:他们坚信,在互联网开发里,如果能够有一个团队在更短的时间内尝试了更多机会(并能改进过来),就能有(更多的)机会胜 出.敏捷是一种态度, ...

  9. 七牛技术总监肖勤:微服务架构实践经验分享

    服务的疯狂增长与云计算技术的进步,让微服务架构受到我们的重点关注.在近日的七牛开发者最佳实践日上,七牛技术总监肖勤介绍了本人在微服务架构方面的实践经验,并接受了恩威科技(微信公众号:天府云创)记者的采 ...

最新文章

  1. ArrayAdapter requires the resource ID to be a TextView
  2. access开发精要(2)-参照完整性
  3. 【知识小课堂】mongodb 之 特殊集合及索引
  4. Tensorflow(0)--Tensorboard
  5. centos下mysql 命令_CentOS下mysql数据库常用命令总结
  6. java shiro jwt_Springboot实现Shiro整合JWT的示例代码
  7. linux mysql 磁盘_Linux运维知识之为Linux MySQL数据库设置磁盘限额
  8. android armv7 libmp3lame.so,lame支持armv6 armv7 i386 armv7s arm64
  9. 怎样选择(FC-SAN)光纤通道(存储)交换机
  10. 网络蠕虫一般利用计算机系统,网络蠕虫是什么
  11. 侯晓迪:全身心的投入,吃住都在实验室
  12. 11.2 注解的使用示例1 select insert update和delete操作
  13. Python web客户端编程简单示例
  14. Tools —— 以管理员身份运行bat文件闪退
  15. 简单理解SpringMVC的三层结构顺序MCV以及ModelAndView的使用
  16. wps自动图文集 重新编号_如何在Word中创建和使用自动图文集词条
  17. 个人单干也能实现年入百万(玩转私域流量)
  18. 中科三方域名管理专题:各种域名状态介绍
  19. aiwi游戏里的忍者神龟
  20. python的前端geany_新人学python必备——Geany配置方法

热门文章

  1. 6款办公软件,文案人员常用到
  2. android sdk 固态硬盘,使用TVM在android中进行Mobilenet SSD部署
  3. 2021年施工员-装饰方向-岗位技能(施工员)免费试题及施工员-装饰方向-岗位技能(施工员)复审考试
  4. ThreadPoolExecutor(七)——总结补充
  5. 转:Eric Lippert:阅读代码真的很难
  6. 关于使用kile自带的printf函数
  7. 你是否了解APP耗电问题?深入探索 Android 电量优化,flutter插件推荐
  8. 仿选单网图片合成小工具
  9. 【JS】Number to digit tiers
  10. html标签 补全方法 python,Python Beautiful Soup学习之HTML标签补全功能