- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
QCon速递异步处理在分布式系统中的优化作用.doc
QCon速递:异步处理在分布式系统中的优化作用
本文根据阿里巴巴技术保障研究员赵海平在2015年QCon全球软件开发大会(北京站)主题演讲整理而成。
赵海平在Facebook工作8年期间,主要针对后端进行性能优化的工作,包括PHP的优化,memcache的优化,等等后端组件。偶然有机会跟阿里的朋友沟通他们遇到的问题,聊得比较深入,就发现虽然阿里是用Java的,但在大的系统优化方面遇到的问题,跟Facebook是很类似的,因此回国加入阿里,希望帮助阿里把整个系统优化得更好。计划第一步是先做整体的profiling系统,以找到性能的局部优化点;之后再进行一些大的架构优化,以及深入到JVM层面的优化。
回国跟很多人沟通,感觉现在到了2015年,国内的朋友们基本上也都对分布式系统的架构相当了解了。今天的演讲就一个主题,就是分布式系统中异步处理的优化。
单机时代的数据请求
十五年前写软件是很简单的,一个Client对应一个DB Server,或者多个Client对应一个DB Server,每一个Client执行各自的服务。当时的讨论很多是说,这个东西要写在Client端还是写在DB Server端,流行的思路有两种:
把DB Server写得很复杂,比如Oracle数据库,而Client端则写得很简单,只有调用返回
DB很简单,只有简单的表,而Client写得复杂。很多创业公司会这样做,因为他们对SQL不是很熟悉,但是很熟悉PHP。早期Facebook就是典型的代表
大数据时代的数据请求
单机时代随着两个趋势而逐渐成为历史。一个趋势是随着互联网的流行,越来越多的人开始上网使用Web服务,而且很多时候用户增长速度是非常快的,结果造成一台DB Server无法储存下所有用户的数据。第二个趋势是计算机能力越来越强,网络服务针对每一个用户要做的事情也变多了,比如Facebook不仅要保存一个用户的个人信息,还有他的关系链信息,他的使用习惯、点击习惯等,就造成一个用户的数据量也大大增加,仅仅访问一个DB Server就准备好一个页面变成了不可能的事情。
这就带来了一个问题:针对多个DB Server的程序应该怎么写?
针对这个问题也有两个思路:
串行同步。先query DB1,返回res1,再使用res1做另一个DB的query,返回res2。这是在第二个Query依赖第一个Query结果的情况
并行同步。针对DB1的query跟针对DB2的query同步进行。这是两个Query之间没有依赖关系的情况。Facebook早期专门写了一个并行处理的函数,用法是 ExecParallelQuery(conn1,Query1,conn2,Query2)
这个时候的代码就比以前的代码更加复杂了,不过还是能实现需要实现的需求。但这时候带来了一个新的问题,就是等待。一个页面的加载可能需要调用不同的函数,而不同的函数可能是由不同的团队写的。比如获取朋友关系的函数getFriends把自己需要的数据用同步的方式获取了,但如果一个第三方开发者过来,则不仅要调用这个函数,还需要调用其他函数,这样其他函数的执行就需要等待前面这个getFriends函数返回了结果之后才能开始执行,就很慢了。
要如何做到并行处理在代码层面很直观,在机器上的执行效率又好呢?
异步的处理思路就是这么来的。
所谓异步就是,我这个函数知道这里需要访问哪几个DB Server,但我先不着急去访问,而是先记录一下,等等看其他函数是不是也要访问这个DB,如果有的话,待会儿再一起去访问。异步处理的指令比如说是 conn.asyncExec(Query) ,这个可以立刻返回一个Future对象,意思就是“待会儿再去执行”。如果每个函数都返回这种Future对象,那么就可以根据这些Future对象来判断哪些请求没有依赖可以并行处理,哪些请求有依赖需要串行处理了。如此,不同的团队写出来的函数就不用一个等一个,而是可以在更高层面上互相合作。
然而这又带来了一个问题,那就是异步处理的写法是具有传染性的。如果一个服务中有的函数写的异步,有的函数没写异步,就会造成有的函数返回了Future Object,有的函数返回了数值,导致无法执行。要实现异步,需要关联的所有函数都用异步的写法返回Future Object才可以。
所以Facebook在转向异步处理的过程是非常痛苦的,一开始做了局部修改,再修改调用了局部修改过的函数的函数,所有调用的调用都要修改,最后全部改成了异步,只要有调用远程服务IO的操作都要改。每一个DB Query都拆分成两步,一个set request,一个receive response。这里的工作量很大,所以如果创业团队的话
您可能关注的文档
最近下载
- 一种电子级硝酸的制备方法.pdf VIP
- 招标文件评分要点深度分析.docx VIP
- 电力行业集团数字化转型信息化战略规划方案.docx
- 作风建设学习教育单位自查清单(28个问题方面)+领导干部作风建设学习教育查摆问题清单(五个方面共15条).docx VIP
- 2024江苏省数据集团有限公司招聘试题及答案解析.docx
- FlyWan双口USB打印服务器安装方法.doc VIP
- 2023年03月六级真题全3套.pdf VIP
- 2024年初三中考第一次模拟考试试题:地理(安徽卷)(考试版A3).docx VIP
- 天津市部分区2022-2023学年三年级下学期语文期末试卷.pdf VIP
- 高铁客运服务案例分析报告.docx VIP
文档评论(0)