前言:
下面的观点来自个人对本次讲座的理解,有不当之处,望大家指正。本次讲座很多技术我都是第一次听说,总结的同时有很多的疑问,如遇高手闲暇之余能为我解惑,倍感荣幸。愿意指点一二的前辈,也可以阅读文章最后我留下来的疑问。
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
分享到:
相关推荐
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
输入格式为:A B # # C # #,使用根左右的输入方式,所有没有孩子节点的地方都用#代表空
如何通过智能卡读写器SDK接入鸿蒙操作系统?通过智能卡读写器提供的SDK范例可以将智能卡读写器接入在运行鸿蒙操作系统的智能终端设备上。
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
QT 下拉菜单设置参数 起始端口和结束端口
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。 本文采用JSP和MS SQL-Server等软件为开发工具,以Windows XP(或Windows 2000)为开发平台,设计出一个学籍管理信息系统,对学生的信息、课程、成绩进行统一管理,便于查询、修改和删除。涉及到的主要内容有:体系结构规划、设计平台的搭建以及系统的设计。主要实现的功能模块有管理系统的功能介绍子系统、新生入学子系统、学生成绩管理子系统、在校学生管理子系统、离校学生管理子系统、各种信息查询子系统以及系统维护子系统。 该系统功能完善,可使高校的学籍管理系统从纯手工中解脱出来,实现高校学籍管理系统自动化、规范化、合理化、科学化,其实用性强,用户界面友好,有助于加快高校的信息传递和智能建设,并为高校整体实现信息化管理体系作好铺垫。。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
该项目为PublicCMS官网2019版的响应式静态化设计源码,采用HTML、JavaScript和CSS技术,包含208个文件,涵盖63个HTML文件、50个JavaScript文件、25个JSON文件、25个PNG图片文件等多种类型,适用于全站静态化模板,支持响应式布局。
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
win32汇编环境,怎么进行加法运算的
内容概要:本文对深度学习领域的注意力机制进行了全面介绍,旨在阐述该技术如何优化长序列处理中的信息筛选。首先,解释了引入注意力机制的原因,指出传统模型在处理长序列任务中存在的不足。然后,分类介绍了软注意力、硬注意力及自注意力三类机制的特点,重点探讨了基于Transformers架构的自注意力机制的作用和意义。接着,描述了注意力机制的具体操作流程:包括打分、加权以及输出组合等阶段。最后,给出了一段使用Python和NumPy构建简单自注意力模型的代码实例。 适用人群:希望深入了解自然语言处理或者机器翻译系统背后原理的研究者和技术开发者。 使用场景及目标:适用于需要解决文本或者其他线性序列中远距离元素间关系的学习项目,例如语音识别、语义搜索推荐等。 其他说明:提供的Python代码可以帮助初学者直观地理解整个过程的工作方式,尽管它只是实现了最基础的功能。
1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/144633303 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
【模型+参考文献】事件触发模型 基于倒立摆matlab仿真 模型为状态空间形式 事件触发机制可自行调节参数
h3cvsr1k-7.1.064-R1340P19 可用于EVE-NG,Pnetlab等模拟器
内容概要:本文档详尽介绍了SC2210这款高性能CMOS图像传感器的技术细节及其应用场景。内容涵盖了SC2210的核心技术参数,如高分辨率(1920H x 1080V)、多种输出接口(MIPI、DVP、LVDS)、宽动态模式、高光敏感度、多传感器同步等功能。同时文档还涉及了初始化步骤、配置接口(I2C总线配置)、寄存器映射等重要信息,旨在帮助工程师深入了解传感器的工作机制和实际操作方法。 适合人群:适用于从事嵌入式视觉系统的硬件工程师和软件开发者。 使用场景及目标:本手册主要用于帮助开发人员设计基于SC2210传感器的产品,如安防监控、网络摄像头、移动设备相机等领域。通过对手册的学习能够理解和配置该传感器的各项功能以满足具体项目的需求。 其他说明:手册详细描述了SC2210的操作流程,包括上电时序、初始化设置、帧率调节等。它还讨论了不同应用场景下的性能优化技巧,如HDR合成、AEC/AGC自动控制等,使得开发者可以根据实际情况灵活运用这些功能。
C语言程序设计(第5版)习题解答-第4章 原创代码
MTPA数值求解两种方法
花生缺陷识别,可识别坏的,有虫子,霉变,萎缩,好的,7245张图片,支持pasical voc xml格式的标注,准确识别率在94.3%以上 花生缺陷识别,可识别坏的,有虫子,霉变,萎缩,好的,7245张图片,支持yolo,pasical voc xml,coco json格式的标注,准确识别率在94.3%以上 详情查看 https://backend.blog.csdn.net/article/details/144984596
qt 一个Qt多线程实现进度条示例.zip 一个Qt多线程实现进度条示例.zip
该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:HTML + Vue.js 后端框架:Spring Boot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven