当前位置: 首页 > 编程日记 > 正文

《异步处理在分布式系统中的优化作用》学习笔记

原文地址:http://www.infoq.com/cn/presentations/optimization-of-asynchronous-processing-in-distributed-systems

视频地址:http://v.qq.com/boke/page/l/0/6/l0196plsvp6.html

主讲人:赵海平 Facebook hiphop HHVM 阿里巴巴技术保障部


问题1.进入大数据时代,

用户增多,数据增多带来挑战,上亿的用户,不能一台机器存所以数据,一个计算机更强大,针对一个用户要做的事情也比以前更多,造成数据量的膨胀。

多到再不可能访问一个数据库就可以展示网页,需要访问多个库。



不好的做法,访问数据库1的结果是访问2需要的依赖,只能先访问1再拿1的结果去访问2,最后汇总结果显示出来。


问题:同步等待。

发现有时候1和2其实没有依赖性,这样就无意义的等待。


并行的发送2个数据库去查询比较好,facebook早年就是有这样的代码,几个mysql同时查询,专门的查询函数查询多个查询,只要这些查询之间没有依赖。


这样让代码复杂性,不过不要紧。问题在于人脑思维有局限性,在真实场景有小组,每个小组负责自己的业务,负责查询自己所在的数据库,所有每个组在函数上是一个同步的写法,同步的等待过程,从数据库抓数据,只要调用其函数就需要同步等待,让并行处理变难。

第三方需要调用多个函数都各自做各自的事情,都同步的抓数据,只能先后调用。让并行处理很复杂。facebook就遇到这样的现实问题。

如何把并行在代码层面写的很直观,又在机器层面执行的非常好就是一个艺术。



新的写法-异步写法

我知道需要访问数据库,先不马上访问,把访问数据库的所有条件记录先下来,记录下来的目的是稍微等待看有没有其他地方也需要访问这个或者其他数据库,如果有可以两个一起处理。所有异步写法就不是一个同步的等待。



异步返回的是Future这样一个object而不是结果result。Future可能不同语言叫法不一样,但是目的都是一样就是将所有将来需要访问数据库的信息记录下来,先不去访问它,有不同的Future的object就可以汇总在一起,再执行

要判断什么样的Future的object可以并行处理,什么样的不能并行处理。可以做调整。


异步写法不再担心函数把异步写法合并,有函数也没事,getresult到最后把Future的object返回给调用者,这个函数可以暂时认为已经结束执行,下一次就无需访问我了,因为我已经告诉你怎么去访问数据库,然后调用者可以去调用其他函数,再调用函数的过程中没有任何的等待过程。调用的人有一个总的调度过程。不同的团队可以写自己的函数,这些函数可以合作。


要求同一个公司都这样写,不然其他调用者对于一个是Future,而另一个是同步进行,调用者就会不知所措,因为返回不同。调用者希望所有的函数给他的都是Future的object。

但是这样阻碍很多的代码转变,fb就经历过这样痛苦的转变,不过异步确实让代码更有效的执行,就开始渐渐在代码中加入异步的调用函数,发现所有调用都要改为Future。



代码第一天开始就用正确的写法以后就不会有这样的问题,facebook局部的把代码变为异步的方法。一旦异步遇到同步就马上去执行异步的数据,把结果再和同步汇总,最后facebook还是把整个网站改为异步写法。每一个函数只要有一个调用远程服务的网络IO的过程就要将其改为异步的。到一个数据库查询先发一个seng请求然后yield,还有另一个操作就是接受Response,把一个同步的等待分为一半一半,一个seng请求和接受Response。


最后发现一个网页形成一棵树,右边最下面2个叶子可以没有任何依赖性都可以到远端调用数据,调用数据都回来了后执行其共同的父节点。然后左边2个叶子没有任何依赖性的执行,每一个节点都是一个Future的object,每个节点2个状态:一个是正在等待执行,还有一个是已经执行了。只有所有的叶子节点执行后才可以开始自己的执行,逐级往上依赖的执行。

一个网页不是马上从后端服务器调用数据,而是组成一个distributed(分布式的)查询,每一个分布式查询可以组成一个依赖性树。





第一个face阶段:总调用者拿到一颗很大的树,这颗树描述数据调用的依赖性。树的每一个node都记录下来怎么调用数据。

第二个face:执行整个树,执行的过程就是所有的底层的叶子可以并行执行,再上面一层,要看执行的速度,有时候某些点快就可以上去的更早,有的点上的稍微晚点执行。无论怎么样,最后的目的是一直往上,顶点也被执行完,这个顶点就是网页的html就被完全准备好了。


发现把PHP变为这样一种语言,不像原来那样一上来就执行,而是一上来先Lazy一下,组成一个query,然后等看清楚完整的query之后再开始执行第二个face。


实例:找出所有朋友中在淘宝买过东西的人。

不能马上得到friends列表会得到一个Future的object,这个Future的object将来会告诉我有哪些朋友。

再yield return getTaoBaoBuyers(friends);需要执行第二个数据调用,是对friends有依赖性的,要知道有哪些friends,然后查这个friend有没有在淘宝购物。



如果是另一个不恰当的例子,在淘宝买保时捷的人可能不会很多就2个人。

第一个例子在淘宝上买过东西的人实际上是狠多的。

在淘宝上买保时捷少的情况下这个查询就出现这样一种问题,是找朋友还是倒过来先查那2个人在淘宝上买过保时捷,再看看这2个人那个是我的朋友?

同一个问题2个方向去解决:可以先查我的朋友,也可以先查这2个人。这2个方向是怎么决定的?


如果第二个问题沿用第一行代码就错了。


应该先查买过保时捷的人!因为第二件事情做得人比较少。

这种情况在传统数据库早就存在,因为存在表连接。在数据库优化上在join的时候会自动做这种优化,看那个表返回的少。innno join从小表这边走。表join方向的问题,传统数据库这样的问题已经被优化,但是写程序就没有做到这一点。

但是fb把网页改为异步,但是fb还没有能够在2个face之间去分析优化查询。

这个问题不仅仅是php中有。任何语言都会遇到要访问多个库的情形,是并行串行?同步异步?的问题。

用同步处理CPU的利用率上不去,用线程去处理并行方案不是最佳方案。线程设的最高300以上以及到了环境的极限。

这个时候需要用很多小小的协程等一些方案做一些小的task.


写代码必须一行行写,但是其实机器可以并行执行代码,这是人脑思维和机器执行的差异。

其实这些并行的优化就是以前数据库做的内部优化的放大。



写第一行代码就已经把表join的方向给静态固化,把哪一个class放memcached里给固化下来。这些都不是一个真正的优化过程。

要的是不要告诉我们表join从哪个方向,也不要告诉我把哪一个class放memcached里给固化,因为写这个的研发人员不知道从系统资源的角度上来说哪个class更值得放入缓存。或者以后业务有整体大的变化,有哪些新的class应该放入缓存,老的class应该从缓存搬走。

所有的这些优化应该是中间的face介于这两者之间组成查询,然后看这个查询在哪儿可以执行,最后经过这样一个优化过程当中再去执行,所有的这些是中间的调度过程中去执行优化过程。


Java和php都没有给我们这样的便利。在fb加了yield return这样的语法实际上非常类似于python的yield return,虽然有yield,但是只是把程序变成2个face。

我们没有办法把这个查询优化为一个更值得优化的一棵树再去执行。

.

只要是分布式系统就要思考怎么用异步来优化。







希望大家把计算机当成科学来看待,以后语言层面已经把异步优化给处理好。

相关文章:

CISCO设备上DHCP实例

Cisco设备上设置DHCP实例 -------------------------------------------------------------------------------- 一位客户想把DHCP SERVER迁移到6509交换机的MSFC上,要求还挺复杂: 1.同时为多个VLAN的客户机分配地址 2.VLAN内有部分地址采用手工分配的…

360金融翟政:科技成就金融场景零容错

翟政,拥有超过20年的互联网经验,我国第三方支付第一批从业者,是多个知名第三方支付公司产品研发团队的组建者,核心系统的主设计师,管理层核心成员。设计搭建的支付系统过去这十年来一直在服务着各行各业的在线支付需求…

OSSIM平台安全事件关联分析实践

OSSIM平台安全事件关联分析实践在《开源安全运维平台OSSIM最佳实践》一书中叙述到,事件关联是整个OSSIM关联分析的核心,对于OSSIM的事件关联需要海量处理能力,主要便于现在需要及时存储从设备采集到的日志,并能关联匹配和输出&…

《Apache Kafka》学习笔记

1.什么是Kafka Kafka是一个高通过率的分布式消息系统 2.消息队列(Message Queue)MQ的模型 消息队列的简单架构图 3个核心概念: Sender Application:消息队列的发送者,也叫生产者producer Message Queue Receiver Application…

4 月 24 日开播!基于神经网络建模的信息传播预测

信息传播在我们的日常生活中无处不在,例如谣言的扩散、产品的推广以及新思想和新技术的普及等等,其建模和预测已经在多个重要领域内得到了广泛的研究。近年来,很多研究者利用以循环神经网络为主的深度学习模型对信息传播过程进行建模&#xf…

并行计算圆周率

看到这个题目,俗了,大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。 书上计算PI用的是精确的数值计算方法,我这里再给出一种概率计算方法。 OpenMP和MPI将同时亮相。 计算PI的方法 1.tan(PI/4)1 > PI4arctan1。知…

kafka-manager 的编译和使用(附安装包)

2019独角兽企业重金招聘Python工程师标准>>> kafka-manager是一个非常好用的kafka web管理工具,yahoo开源。 地址:github.com/yahoo/kafka-manager 1、编译过程比较简单,重点是能翻墙,如果网络环境不允许,可…

匿名函数应用-多线程测试代码

多线程测试代码&#xff0c;不用单独再写一个类&#xff0c;比较方面而已。 public class MainThread { static int a0; for (int x 0;x<100;x){ Thread t new Thread(new Runnable() { Override public void run() { while(true){ try { a;System.out.println(a);…

YOLOv4来了,大型调优现场,速度和准确率俱佳

作者 | VincentLee来源 | 晓飞的算法工程笔记简介论文提出YOLOv4&#xff0c;从图1的结果来看&#xff0c;相对于YOLOv3在准确率上提升了近10个点&#xff0c;然而速度并几乎没有下降&#xff0c;论文主要贡献如下&#xff1a;提出速度更快、精度更好的检测模型&#xff0c;仅需…

关于对J2EE几点误解和错误认识的澄清

转自&#xff1a;http://www.jdon.com .Net和J2EE的争论一直没有停止&#xff0c;我也参加过“程序员”杂志主持的“.Net和Java之争”之类的讨论&#xff0c;本来这两种技术都是为用户提供了竞争性的选择&#xff0c;对于用户来说是一件好事&#xff0c;多种选择远胜于单一选择…

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r...

2019独角兽企业重金招聘Python工程师标准>>> Struts Problem Report Struts has detected an unhandled exception: Messages: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or re…

Java的Redis连接池代码性能不错

其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183&#xff0c;有2个版本&#xff0c;差别就是ReentrantLock和synchronized。另外原作者使用了断言&#xff0c;我觉得这个还是不用为好。 ReentrantLock版 import java.util.concurrent.locks.Reent…

降低预测过程计算成本,这些NLP模型压缩方法要知道

编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近年来&#xff0c;基于谷歌Transformer的语言模型在神经机器翻译&#xff0c;自然语言推理和其他自然语言理解任务上取得了长足进展。通过多种语言模型的平均损失进行自我监督预训练&#xff0c;使得在大范…

政府要尽快对应用商店出台管理办法

前两天联想的开发者大会&#xff0c;我和联想的CTO贺志强先生联合接受了一个视频访谈&#xff0c;贺先生谈到联想的乐园软件商店&#xff0c;组织大量的人力对于软件进行检测&#xff0c;以保证软件是合格产品&#xff0c;不会给用户一路带来侵害&#xff0c;对于联想这种负责态…

antlr-2.7.6.jar的作用

项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

junit集成Hamcrest测试集合中某个属性是否包含特定值

junit已经集成Hamcrest但是还是需要引用hamcrest-library&#xff0c;不然只有基本方法&#xff0c;高级的没有 <dependency> <groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

腾讯第100个开源项目:微信开源推理加速工具TurboTransformers

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;4月24日&#xff0c;腾讯正式宣布开源Transformer推理加速工具TurboTransformers。该工具面向自然语言处理领域中Transformers相关模型丰富的线上预测场景&#xff0c;在微信、腾讯云、QQ看点等产品的线上服务中已经广…

程序员:提高编程效率的技巧

本文写给那些认为在项目上所花时间和效率成正比的程序员。我要说的是&#xff0c;事实并非如此。虽然你需要在电脑前敲键盘输入东西&#xff0c;但这只和编程沾上一点边。那么&#xff0c;程序员该如何利用时间呢&#xff1f; 俗话说&#xff0c;磨刀不误砍柴工&#xff0c;拿出…

Qunee for HTML5 V2.5新版本发布

为什么80%的码农都做不了架构师&#xff1f;>>> Qunee for HTMl5 V2.5 beta2版本正式发布,此次版本内核改动较大,采用了新的2D渲染引擎,增加了延迟绘制功能,大幅改善画布的浏览体验,此外重构了鼠标键盘以及触控交互监听处理,增加右键框选功能,改善了多点触控交互,增…

泛型推断类型不符合上限

程序报错推断类型不符合上限 springsecurity需要自定义用户服务 代码 Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(new CustomUserDetailsService());}public class CustomUserDetailsService implemen…

如何通过深度学习,完成计算机视觉中的所有工作?

Mask-RCNN做对象检测和实例分割作者 | George Seif译者 | 天道酬勤&#xff0c;责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;Mask-RCNN做对象检测和实例分割&#xff1a;https://miro.medium.com/max/1200/1*s9raSe9mLeSSuxE3API-ZA.gif你想做计算机视…

Windows PowerShell 2.0语言之字面类型系统

PowerShell语言允许通过一个字面类型&#xff08;type Literals&#xff09;来访问类型&#xff0c;它是用括号抬起的类型名&#xff0c;返回.NET底层的System.Type对象实例&#xff0c;如&#xff1a; PS C:\> [System.Int32]IsPublic IsSerial Name …

建立名称server

一、实验的目的&#xff1a;实现DNSserver功能&#xff0c;提供正向、反向解析二、实验环境装有Linux的Windows系统IP为192.168.6.3的虚拟机三、实验目的建立gr.org域的主名称server。解析&#xff1a;名称 IP 用途ns.gr.org 192.168.…

Java的JSON操作存储List到Redis

使用jackson和json-lib都可以 <dependency> <groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><dependency><groupId>net.sf.json-li…

关注基于云的下一代应用开发

接受经济和信息化的视频专访专访的主页地址为&#xff1a;http://www.enicn.com/article/2010-08-20/0R064b52010.shtml我的其他视频&#xff0c;请参考土豆空间&#xff0c;地址为http://www.tudou.com/home/larryvmw。

确认了!MySQL 狠甩 Oracle 稳居 Top1!

01几乎所有程序员都会用到的 MySQL稳居 Top 1科技长河&#xff0c;顺之者昌&#xff0c;错失者亡。在2019年&#xff0c;CSDN面向具备超强计算力的数字化世界&#xff0c;我们进行了「大数据技术应用现状分析」&#xff0c;并发布了《2019-2020 年中国开发者调查报告》。发现&a…

[AWK]使用AWK进行分割字符串以及截取字符串

如何split当前的字符串&#xff0c;用$0&#xff0c;例如&#xff1a; cat num.2012032911 | awk {print $2} | awk {split($0,b,".");print b[2]} | cut -c 3- 获取第二列&#xff0c;例如第二列是com.sb3456.you那么在split当前的这个字符串获得sb3456,最后截取sb3…

SpringMVC集成Tiles布局引擎框架

Tiles布局框架&#xff0c; http://tiles.apache.org/ Spring已经对Tiles进行了集成。页头页尾公共模板页要靠这个&#xff0c;不然重复代码太多。 <dependency><groupId>org.apache.tiles</groupId><artifactId>tiles-servlet</artifactId><…

VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

右击项目->属性->字符集&#xff1a;使用多字节字符集。这样可以使用char到CString的转化。char sRead[20] ""; CString strtest sRead; 大气象 //文件查找/*CString strFileTitle;CFileFind finder;BOOL bWorking finder.FindFile(_T("C:\*.sys"…

程序员会懂的冷笑话:各大编程语言的内心独白

作者 | Anupam Chugh译者 | 弯月&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;软件工程领域鱼龙混杂。有些人乐不思蜀&#xff0c;而有些人则饱受打击。然而&#xff0c;构建软件的工作让每个人倍感压力&#xff0c;这点毋庸置疑。在本文…