前言:
下面的观点来自个人对本次讲座的理解,有不当之处,望大家指正。本次讲座很多技术我都是第一次听说,总结的同时有很多的疑问,如遇高手闲暇之余能为我解惑,倍感荣幸。愿意指点一二的前辈,也可以阅读文章最后我留下来的疑问。
3月27号,提前一个小时下班,前往中山大学参加腾讯大讲堂《微信之道:至简》讲座。大厅内人山人海,主讲人微信技术总监周颢(harvey zhou)也甚是激动,夸赞大家的学习热情。周颢讲到微信的成功可归结为三点:产品的精准,项目的敏捷,技术的支撑。
要素一:产品的精准
从对国外应用Kik敏感的嗅觉,到微信从无到有的建设,实用的功能,简单的操作,是微信成功的关键。微信一直以来秉承着“
用简单的规则构造复杂的产品”的理念,才有了今天小小的成功。这句话道理简单,但道路艰难。
要素二:项目的敏捷
敏捷开发主要借助一种技巧Scrum,它不同于那种一次制定几年开发计划的方式,取而代之的方法是建立不同的发布版本,持续不断的改进软件系统。将大目标分解成简单的小目标,通过几天地冲刺完成一个小目标,通过完成几个小目标进而完成一个大目标。
科技蓬勃发展的今天,人们的注意力会被更加新奇的东西吸引。巨人柯达都倒下了,如果你还想踏着他的尸体继续前进,那你就需要更多努力、更多尝试。只有在同样的时间比别人做更多地尝试,你才有更大的概率成功。也就是说一要有多尝试决心;二要有多尝试的能力。
敏捷就是一种态度,你需要允许发布前十分钟需求做变更,给予产品决策的最大自由度;
同时敏捷也是试错法,他可以帮助你在更短的时间,做更多的尝试,走正确的道路。
当然想要在更短时间比别人做的更多,并不意味着要不断地加班,如果有强大的技术支持,那就会事半功倍。
要素三:技术的支撑
技术支撑其宗旨在于
剥离复杂,让剩下的更简单。也就是将复杂的东西封装起来或拆分开来,让其变得更加简单易用,同时具备一定的灵活性。如果一个东西本来挺简单,将其抽象化后变得晦涩难懂,那就说明这个抽象是有问题的。微信的技术要点可概括为:
1、大系统小做
2、让一切可扩展
3、提供基础组件
4、轻松的上线
技术•大系统小做
将系统分离成几个独立的模块设计,并且分开部署。但物理上的分离越细,其维护的成本就越高。所以我们可以采用折中方案,适当地分离,然后将不同的模块混搭在一起。
技术•让一切可扩展
1、网络协议可扩展。
2、数据存储可扩展。采用key¬-value的形式存储数据,提供类似SQL的操作方式。
技术•基础组件
1、针对网络协议的Client/Server代码自动生成工具。
2、逻辑容器。
3、监控报表组件,可以做到5分钟添加一个报表,1分钟出监控数据。
4、存储组件,主要用于容灾。
技术•轻松的上线
灰度发布,即每次更新一部分服务器。监控其运行状况,然后调整,再发布,再监控……直到稳定,才更新所有的服务器。及时的监控加上灰度发布,让用户还没有感觉到异常,就将其消灭。
以上提及的这些技术,其复杂点在于:
1、协议
2、容灾
3、前轻后重
4、监控
复杂点•协议(不太懂)
1、CMWAP vs CMNET
CMNET、CMWAP都是上网使用的接入点的名称。通过CMNET可以获得完全的Internet访问权,通过CMWAP只能访问WAP网站,不过 CMWAP使用HTTP代理协议和WAP网关协议可以访问到Internet,而CMNET则适用于所有协议,它是标准的TCP/IP协议。
2、在线 vs 离线
在线和离线的含义越来越模糊,用户可能同时开启多个应用,而一个时间只能激活一个应用,其他应用则在后台运行,用户可以在任何时候切换到其他应用(比如:微信),这时要求用户在该应用上还是处于登录状态。个人认为,应用在后台运行时,可认为用户是发呆状态。
3、资费敏感
这就要求用户请求/服务器回传的数据应该尽量的小。
4、连接不稳定
5、高延时
已有的协议标准(XMPP, SIP/SIMPLE)简单,但占用流量大,消息不可靠。因此微信采用了自主研发的SYNC协议,他通过“握手”来同步消息,采用Server通知/Client主动获取的交互方式。其优点包括:
简化交互方式、增量传输数据、可靠有序传输、消息重传控制。
复杂点•容灾
对微信来说用户体验是至关重要的,因此服务应该保持高度的可用性,一定要响应用户。为了降低出错的概率,我们将相同的业务分布在不同机器上,机器A坏了,可以让机器B继续处理业务。 但是由于分布式的运用,A和B可能会出现数据不一致的问题。当然可以通过同步来保证数据一致,但这样又会由于同步导致服务长时间不响应,甚至不可用,或者产生牵一发而动全身的影响(同步一般需要在单点进行,如果这个点宕掉了,整个个业务也就宕掉了)。
上面描述的其实是一个分布式的CAP理论。Brewer认为在分布式的环境下设计和部署系统时,有3个核心的系统需求,以一种特殊的关系存在。这三个核心需求是:Consistency,Availability和Partition Tolerance,而这三个需求无法同时满足。在微信的设计中,放弃了一致性Consistency,主要考虑3点:
1、
防止雪崩,避免蝴蝶效应
问题发生时,用户会不断的重试,导致请求数增加,而单个服务器的性能也会大幅下降。
2、
柔性可用,追求不完美
不能因为一个功能不可用,导致其他功能也不能用。应该忽略小错误,保持应用整体可用。
3、
保护点前置,赢得处理空间
在接入层处理问题,比如使用GSLB(Gobal Server Load Balance)/ LVS(Linux Virtual Server) / IP Redirect/ Client Retry。
存储层容灾是相对复杂的,需要分而治之。可以下面3种方案,而微信采用的是最后一种方案。
方案一:主从模式
优点:简单
缺点:故障时不可写
场景:帐号系统
方案二:双写模式
优点:简单、故障时可写
缺点:数据会轻度丢失
场景:用户终端的记录
方案三:主从+多写模式
优点:故障时,仍有很好的概率可读可写
缺点:多服务器的维护成本
原理:R+W>N && R > W(Quorum算法),假设有一个子存储业务有10个节点(N),每次写操作时同时向5个节点写入数据(W),每次读操作同时向6个节点读取数据(R)。这样总是能保证至少一个节点读取的数据是最新的,而这种做法读取到错误数据的几率非常之小。
难点:第一,要能判断读出的哪个节点的数据是最新的;第二:每次向不同的节点随机写数据可能存在冲突;第三:节点宕掉如何恢复。
解决:当然Quorum算法均给出了相关的解决方案,但现实相对复杂,微信技术团队想出了一种Simple Quorum的实现。从harvey(主讲人周颢)的描述中,我大概猜到他是这么做的。首先有个全局的序列发生器(高度稳定、一致),保证系统每次接收用户请求或存储数据都能产生一个递增的序列号,这样通过对比数据的序列号,就知道那个节点的数据是最新的了;其次存储数据时,可以选择一次存储单个实体(比如:用户)的所有数据,而不是修改某个字段,这样就不存在冲突问题;最后,保证每个节点都只存储少量数据(比如:200K),可以通过直接拷贝数据的方式恢复。下图给出如何判断读出的哪个节点的数据是最新的。
图一,生成序列号的过程:
图二,判断最新数据的过程:
复杂点•前轻后重
客户端应该尽量的简单,而服务端承载更多的功能。这样更新功能更加容易,且客户端不容易崩溃。
复杂点•监控
监控需要将多项数据以图表的形式实时呈现,并且通过实时数据和历史平均值的对比,实现对异常的自动预警和报警。
另外,监控不等于统计,监控分析的实时的数据,而统计做的是海量数据非实时的分析。
疑问:
1、分布式系统中那么多服务器,怎么来统一维护,需要用到什么技术?
2、一个产品如果需要监控,哪些基本的数据需要做监控呢?这些数据又从哪里来?远程监控又如何做?
3、求这次演讲的PPT?本人联系方式350653546__qq.com,请把__替换成@再发送邮件。
4、如没有时间详细指点在下的话,为我指明方向也不甚感激。
后话:演讲结束后有个提问环节,有同学提到腾讯抄袭和一家独大的问题,harvey(主讲人周颢)做了很好的回应。这里我也说说,正如harvey所讲,抄袭和超越是有很大区别的,只有用心做产品的人才能把产品做强做大。腾讯的平台和用户群是有力的竞争筹码,但这也是腾讯多年来辛勤耕耘的成果,前人栽树后人乘凉,而且用户也不能否认产品结合腾讯的平台带来的便利。至于一家独大嘛,我想说柯达和诺基亚也够大,但现在呢?技术的更迭是迅速的,正所谓生于忧患,死于安乐,所以大家努力吧!最后感谢腾讯的开放,感谢harvey给我们深入浅出地讲解这么多宝贵的知识,也感谢我的大学同学孙业军为我提供这次讲座的报名信息。
- 大小: 13.4 KB
- 大小: 12.7 KB
- 大小: 24.1 KB
- 大小: 29.7 KB
- 大小: 31.7 KB
分享到:
相关推荐
### 微信技术总监谈架构:微信之道——大道至简 #### 一、微信之道:大道至简 在“微信之道——大道至简”的分享中,微信技术总监周颢(Harvey Zhou)深入剖析了微信如何通过简洁的设计理念来应对移动互联网时代的...
《架构演进:微信之道-至简》是深入解析微信技术架构发展的一份珍贵学习资料。这份资料通过深度剖析微信的架构演变过程,揭示了如何在复杂业务场景下实现高效、稳定、可扩展的系统设计。以下是根据标题、描述及提供...
微信小程序:调起摄像头拍照并在页面预览图片 微信小程序:调起摄像头拍照并在页面预览图片 微信小程序:调起摄像头拍照并在页面预览图片 微信小程序:调起摄像头拍照并在页面预览图片 微信小程序:调起...
微信小程序:宠物百科,宠物资讯,宠物社区 微信小程序:宠物百科,宠物资讯,宠物社区 微信小程序:宠物百科,宠物资讯,宠物社区 微信小程序:宠物百科,宠物资讯,宠物社区 微信小程序:宠物百科,宠物...
微信小程序:王者荣耀故事站小程序带Vue后台微信小程序:王者荣耀故事站小程序带Vue后台微信小程序:王者荣耀故事站小程序带Vue后台微信小程序:王者荣耀故事站小程序带Vue后台微信小程序:王者荣耀故事站小程序带...
《微信之道》
微信小程序demo:仿商城(源代码+截图)微信小程序demo:仿商城(源代码+截图)微信小程序demo:仿商城(源代码+截图)微信小程序demo:仿商城(源代码+截图)微信小程序demo:仿商城(源代码+截图)微信小程序demo:仿商城(源...
微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信小程序 画布:时钟 (源码)微信...
WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人WechatBot:微信ChatGPT机器人...
#### 一、微信之道——至简 - **背景介绍**:微信作为一款现象级应用,其成功离不开其背后强大的技术支撑与先进的设计理念。微信技术总监周颢在腾讯大讲堂的演讲中分享了微信在技术架构上的独到之处。 - **核心...
微信小程序demo:花店(源代码+截图)微信小程序demo:花店(源代码+截图)微信小程序demo:花店(源代码+截图)微信小程序demo:花店(源代码+截图)微信小程序demo:花店(源代码+截图)微信小程序demo:花店(源代码+截图)...
微信小程序demo:商城(源代码+截图)微信小程序demo:商城(源代码+截图)微信小程序demo:商城(源代码+截图)微信小程序demo:商城(源代码+截图)微信小程序demo:商城(源代码+截图)微信小程序demo:商城(源代码+截图)...
微信小程序demo:Railay:整体框架(源代码+截图)微信小程序demo:Railay:整体框架(源代码+截图)微信小程序demo:Railay:整体框架(源代码+截图)微信小程序demo:Railay:整体框架(源代码+截图)微信小程序demo:...
微信小程序demo:狼人杀:猎人之章:附老版下载(源代码+截图)微信小程序demo:狼人杀:猎人之章:附老版下载(源代码+截图)微信小程序demo:狼人杀:猎人之章:附老版下载(源代码+截图)微信小程序demo:狼人杀:猎人...
微信小程序demo:豆瓣(源代码+截图)微信小程序demo:豆瓣(源代码+截图)微信小程序demo:豆瓣(源代码+截图)微信小程序demo:豆瓣(源代码+截图)微信小程序demo:豆瓣(源代码+截图)微信小程序demo:豆瓣(源代码+截图)...
微信小程序demo:豆瓣电影:使用API(源代码+截图)微信小程序demo:豆瓣电影:使用API(源代码+截图)微信小程序demo:豆瓣电影:使用API(源代码+截图)微信小程序demo:豆瓣电影:使用API(源代码+截图)微信小程序demo:...
微信小程序demo:页面框架(源代码+截图)微信小程序demo:页面框架(源代码+截图)微信小程序demo:页面框架(源代码+截图)微信小程序demo:页面框架(源代码+截图)微信小程序demo:页面框架(源代码+截图)微信小程序demo...
微信小程序demo:简易抽奖(源代码+截图)微信小程序demo:简易抽奖(源代码+截图)微信小程序demo:简易抽奖(源代码+截图)微信小程序demo:简易抽奖(源代码+截图)微信小程序demo:简易抽奖(源代码+截图)微信小程序demo...