【CSDN现场报道】2015年11月19-21日,由CSDN重磅打造的“ 2015 中国软件开发者大会 ”(以下简称SDCC 2015)在北京朗丽兹西山花园酒店隆重召开。今年是第七届,大会为期三天,除了阵容强大的全体大会外,主办方还精心筹备了九大技术专场论坛,包括:架构实践论坛、前端开发论坛、数据库实战论坛、研发管理论坛、安全技术论坛、算法实战论坛、编程语言论坛、产品与设计论坛、微信开发论坛。此外,还有五场特色活动及展览展示。
2015中国软件开发者大会首日的全体大会上,来自Elixir设计者、Rails核心团队成员的José Valim带来了名为《Building distributed fault-tolerant applications with Elixir》的主题分享。期间,Valim分享了Elixir和Erlang语言相比传统的C++在分布式系统上的优势,以及Erlang在处理异常时的特殊机制,这种机制使得分布式系统更加健壮了,最后分享了elixier语言的设计目的。
Elixir设计者、Rails核心团队成员José Valim
以下为现场速记整理:
大家早上好。我第一次来到中国特别的兴奋。今天我会给大家介绍一下Elixir ,我的发言的目的,并不是要告诉大家怎么样去利用Elixir ,而是要说服大家去尝试用一下Elixir 。因为大家所要做的会完全改变软件开发的方式,我的发言的目的就是给大家介绍一下Elixir ,我希望大家去尝试着用一下Elixir ,希望你用它之后可以改变你编写软件的方式和思维方式。
Elixir ,它是在一个虚拟设备上使用的。我为什么知道这一点呢?我当时是Rails核心团队的成员。谁知道rails?这是一个现成的框架,有很多的公司都用它。这是我们在2006年所做的,我们要的是Ralil 的线程安全,这是什么意思呢?这就是意味着,在7、8年前我们都知道我们的设备,有越来越多的核,我们的计算机有4核,我们现在很容易的有24核和40核的计算机。那时候Ralil 的团队都已经知道,设备有越来越多的核。当我们有应用的时候,我们希望能够利用设备上所有可用的核。我们知道这一点,我们也想要去找到解决方案,比如说Java和C++,如果说你想要去利用多核的话,你就要用线程,关于线程,我们不能够一开始就用它,然后一切就运作得良好,我们必须要改变我们的核、代码。来确保这些代码的线程安全,这是我们所做的,我当时参与到当中,我们要使线程得到改进,这做起来是非常难的,也让我们感觉到非常的沮丧,我们会做工作,之后发现有问题,然后又要重新的做。当时我们要不断的去改善软件的话,是比较难的,后来我想如果说同步变得越来越重要,因为我们现代社会当中有越来越多的核,现在有C++和Java这样的语言,这样工具不好我们要做改进,后来我们就进行研究,去看看其他的编程语言,他们是怎么样解决这个问题的?在该研究的过程当中我发现,有一个类别的编程语言,他们是非常好的,而且是功能性的编程语言,我可以给大家讲,功能性编程语言的好处,它最大的一个好处就是对于同步和并发来说和(英文)是很有价值的,我们有一个对象,目的就是要去捕捉住状态,当我们有线程的时候,有两个核他们是同时来运作的。那么现在有两个核,他们要改变,同样的一个状态,同样的内存,可能会出现一些问题,而功能性的编程语言,在对象当中它的状态会得到延长,我们可以看到存在着这样的问题,那么及时我们避免去改变状态,我们还是希望能够进一步的去做出改变,出一些改革,我就想,这样的功能性的工程语言非常有意思,功能性的语言特别多,有一个特点我是特别喜欢的,它和Java 还有虚拟设备上的Java 是一样的,比较有意思的就是它的设计是由一家电信公司所设计的,他们有非常多的有意思的商业前景,比如说你是爱立信的工程师,你想要做的工作。这是和电信公司的业务结合在一起的,他们会涉及到电话交换机,转换器能够使一个人和另外一个人来进行沟通这样的话我们希望利用电话交换机,而且我们也希望它能够把尽可能多的人连接在一起,让他们同步进行对话。当我们进行设计的时候,我们就想我们必须要去支持同步的沟通,可以让很多人同步的讲话,有时候有一些人要打电话,但是这个人他是通过另外的一条电话线路和人打电话,所以大家要去思考一下电信的架构,我们有非常多的电话的交换器是彼此的连接在一起的,我们当时的想法就是我们需要建立一个分布式的系统,这些设备彼此相互的连接,他们可以进行信息的交流。
当时爱立信是想了非常多的使用的前景,创造了非常好的设备,这个设备在电信领域当中运作了很长的时间,很多年,但是它只是在电信领域当中应用的。后来到2004年和2005年的时候,他们认识到这样的一个想法我们有电话的交换器,还有很多的连接,那么实际上这也是我们的一个使用情景,是网络上的使用情景,我们在网络上是希望有尽可能多的客户端和一个服务器结合在一起的。
而且我们发展的方向是,有移动手机,现在移动的手机总是和服务器结合在一起的,连接在一起的,获得更新的信息,我们还有嵌入的设备,他们也有自己连接的要求,公司就认识到了这一点,如果那个想法在电信领域当中应用得非常好,那么它也可以应用在网络上,很多的公司开始利用了这样的一个设计,亚马逊和FaceBoonk 都开始用。
Erlang有一个比较特殊的使用的情景,不知道大家在中国都知道,但是在欧洲、俄罗斯、巴西人们都非常的了解他,WhatsApp,是一个信息的应用,你可以和朋友交换信息,Faceboonk 收购了它,收购价是900亿。现在他们可以用200万个连接了,现在来讲,我们可以通过这个,通常我们发短信的时候是需要把信息发送到主机,由服务器在给我们的朋友发短信,那么现在来讲,它直接可以同时连接200万个终端和设备。所以说这是一个非常强大的工具,它有24CPU和96GB,只使用40的缓存和CPU,所以这就是我们需要这个,我想要把这个软件用在我的设备上。然后我要进行工作的时候,进行生产的时候,我不管我的生产会应用多少资源,也许是40CPU还是60CPU,我的这个设备就可以帮助我进行资源的调取,所以我们做了很多的研究和案例,我只想要给大家分享一下,有一些具体的一个案例,这个案例叫做高层次的、高速度的电信软件的应用和分配,那么我们把这个和C++和Erlang 进行了比较,我们的概念是从电信系统有两个主要的部件,第一个是数据移动的主机,或者说是数据移动的服务器,第二个是有一个控制器,我们和摩托罗拉合作,摩托罗拉大部分都是由C++进行做的。然后他们就开始看了Erlang ,大家可以看一下这个数据的比比较,比如说当我们进行比较我们的CM院的编码的大小的话,C++的大小是很大的,Erlang的编码会比C++要小7倍,所以对于我们来讲,我们要达到同样的目,我们的编程是更加的简单了,简单了很多,所以这是一个非常好的开端,不仅仅是这一点,还有更有意思的现象,大家可以进一步的来看一下编码,在C++之中只有20%的编码是有商业价值和商业逻辑的。所以只有20%的C++的语言和编码是和业务有关系的,但是erlang 还好,20%以上的编码都是和业务和商业编码和商业逻辑相关的。
所以很多的编码用的逻辑就是这个发生了我应该做什么?之后应该做什么?所以大家就应该要预防,但是Erlang 来讲,有25%的编码是预防性的编码,所以大家一定要关注这一点,如果说我们看这些具体的数据,我们就发现如果我们的编码之中有很多预防性的编码,对于我们忙于去应付各种各样的情况,所以我们就有很多冗余的编码,就C++来讲就有很多的冗余。所以我们有一个数据移动的终端和数据移动的服务器。那么大家看到这个数的纵轴是每一秒钟的数量数,横轴是每一秒钟的负载,所以在两个服务器之中都可以,如果说我发送了1000个指令和要求,就C++来讲用了很多的内存,如果说你是电信公司,在某一个时间段有一个非常大的需求量,比如说在中国的春节,在某些时段我们想要给我们的朋友打电话,在这个时间段我们就会有很大的荷载量,所以对C++来讲有很大的占有量。如果说我们进一步的增加需求呢?我们可以看到,从那个时间点开始我们增加了需求量,服务器不能够用更好的速度来运转。所以我们就会问,如果我们继续放更多的会怎么样呢?大家可以看到,我们实际上是减低了服务器回应的速度和效率。甚至是我们发送了60倍我们的服务器能够应对的量可以看到,erlang 的服务器没有崩溃,还在进行运作。erlang 这样的语言是特别为电信公司设计的语言,erlang 的解决方案要比c++优越很多,最后都是要大家看一看的,大家一定要为erlang 这个语言感觉到非常的高兴和非常的激动。我怎么样去用erlang 呢?怎么样进一步的去进行设计和建造呢?原因在这里。在不同的工具来进行编写程序的时候,比如说就爱立信来讲,我们一定要学新的一些编码,新的一些代名词和新的一些构架,这是很难的。所以当我们在C++的语言和jave 的语言之中来进行编写软件的话,我们都是编写线性的编码,主要的功能就是每一件事情都可以等式,它都是一个线性的。
我们有线性的,但是我们在线性的编码之中又有相互的交叉、交集,实际的情况并不是非常的特别,我们也是用到了线性的编码,但是在我们的编码之中,我们把非常简单的处理程序加入到其中。从现在来讲,c++,我讲到一个程序,并不是讲运营的程序,而是指在erlang 当中应用的一个非常小的处理。比如说在一个终端上就同时有200个连接,为什么能够达到这样的效果和速率呢?就是加入了这个小小的改变,我们把所有的程序,大家可以看到这些小小的点都是每一个进程和每一个过程,每一个过程里边都有它自己嵌入的编码,我们把这些点连接起来就成了erlang ,它也是一个轻质化的执行方式。同时它也是一个分区的独立的编码。通过各种方式,你看,他们之间的模块都进行语言、或者说信息的交互。比如说我们选4个进程,我们来理解,进程怎么样?他们怎么样来进行相互的交互?我们来看一下所有是一个网络的服务器来进行运作这4种进程,首先我们就需要有数据库,也就是DB,因为我们的数据库可以进一步的得到网络的需求,然后这就是一个进程。另外我们在web上也需要一个进程,那么这里还有一个就是mailer,mailer 就是一个邮件,邮件的进程就是负责发送邮件的,有意思的是,这些都是相互连接的,如果有一个进程不能够工作了,但是它不会影响到其他的进程正常的工作。比如说讲到Java ,如果说你用jboxs,你要进行发送邮件的话,这个邮件如果有问题,可能会让整个的服务器崩溃。所以你说我们要发一个邮件,这个邮件之中有一些不良编码,为什么发一个邮件会让我整个的服务器崩溃呢?因为java的设计是相互连接的,有很多的工作要来保证在我的编码之中有一个事情坏了,有一个事情做错了,整个的构架都会崩溃。
那么应该有一种方式让我们能够有一些情况下,这些情况和这些问题都是我们需要在java这样的情况下解决的,比如说C++这样的语言都是做了很多预防性的编码,就这里来讲,每一个进程都是独立的,比如说邮件发送器有问题的话,它就崩溃了,但是不会影响到其他的进程和其他的程序,所以它是一个整个的,所以我们需要干嘛?我们有一个主监管方,这个主监管器可以监管下面的分进程,如果说我们要发一个邮件,如果说这个进程坏了的话,我们的主机的主监管方都会发出执行,告诉下面的进程有一个坏了我们不能够和它进行交互,如果说有一些问题产生了,比如说邮件这个进程坏了的话,就让它坏吧,所以有两个原因。当我们用电脑的时候,我们的操作系统有的时候不正常工作的时候,我们怎么办?我们要重启,对吗?每次都是重启我们的操作系统,我们从最开始原始的状态开始工作,那个时候才能够工作。这个状态,就能够保证我们开始启动服务器,这个我们用了同样的思维方式、思路。我们重启了最根本的模式和重启了整个的构架,第二个理由是,编写复杂的编码,是没有用的,不管你用什么样的语言来讲,及时你在全球拥有最复杂的编码,但是我们是人,我们都会犯错误的所以我们所有的软件的编码都会有bug,如果说我们的bug在整个的网络上进行应用了整个的网络都会崩溃。所以很多时候我们编写的东西不会像我们预期那样去运作,所以我们不应该去疯狂的去寻找答案,去解决这样的问题,我们就会说,别担心,即使有问题出现了,我们需要去解决的不是要去编写复杂的语言而是要去隔离它。所以也就是说,就erlang 来讲我们的系统之中只有0.5%的编码是预防性的编码,在这样少的预防性编码的过程中我们还能够保证erlang 的系统能够正常的运作,因为我们有监管器,我们的监管器有它的职责,可以进行整个过程的模拟和监管。所以我们把所有的东西都做为APP。所以,我们今天学了几个词,首先我们用了processes这个词,我们又有一个特别的进程叫做监管,叫做supervisors,这个监管做出了它的监管职责内的任务,然后我们又有一个词叫做app应用,我们还有一个词就是信息的分享和信息的交互,如果我们做这些事情的话,我们把这些关键词结合起来,我们的软件允许错误的发生,即便专拣之中有编码的错误,我们还可以保证软件正常的运行。最后有一个事儿我没有说到,就是说分布。我们的系统怎么样来进行分布的?大家可以看到之前有一个幻灯片,所有的这些小的进程之中都用箭头联系起来,我要讲到这个分布,这个分布就是,不管是一个机器在运作还是两个机器在运作,我们之间的分布都是可以交互的,我们可以把这个软件分享到两个机器上去,两个机器上的进程都可以交互,进程之中的信息的交互都是透明的、分享的、开放的。所以这是我第二部分的研究。
我之前给大家讲到erlang ,讲到大家为什么为erlang 的产生而激动和兴奋。第二我谈到erlang 有几个词来代表它的运行和革新。我们有很多不同的语言,其中有一个语言是elixir的语言,这个语言是我创造的,它的不同是什么?Elixir为什么比其他的语言不同?为什么比其他的语言来优越,我最后就是给大家讲一下elixir为什么是优越的语言,我用这种方式给大家介绍一下,它是一个语言,它有3个目标,首先就是兼容性,然后是可扩展性、创造性。兼容性就是我们用的程序和构架都可以在当中运用。它的运作非常良好,而且你在这个上面所通用的一些东西,不会影响到elixir的性能,因为它有非常好的兼容性,兼容性是非常重要的特征,我们不仅仅有好的兼容性,我们还有自己的httpoison,这是一个非常简单的代码,这是一个start的代码我们在erlang 上还有特定的编码,在这样的代码之中,它所做的就是,进入到一系列的网站上。第一条线,我们是有一个特定的客户端,接下来我们去既定我们要做的queries,这个是做的查询,对于每一个查询我希望能够启动一个新的任务、新的流程。它会帮助我们去执行一个特定的功能。
我们已经有了所有的查选了,接下来就关键流程,然后再去创建一个,然后我们就进入到网页之中,后来一条线,你说我现在有了这些所有的流程了,他们是同步来运行的,我要做最后的一个任务,大家可以看一下这里的代码,我们可以通过这样的编码,可以让我们很容易的进入到网站上只需要这些编码都可以了,这就是一个关于兼容的例子。
第二个目标就是可扩展性,怎么样给大家描述可扩展性呢?我们有一个人说,我们现在要进入到源数据当中,我们不应该去思考把语言的设计看成是一个语言设计的样式。它是创造出一个更多工具的工具,他的意思是我们现在编成的语言是非常广泛的领域,我们不能够只是设计一个编程的语言在所有的计算机当中都运作,我们所设计的编程的语言可以和其他的编程的语言可扩展。
我给大家展示两个例子,这是我们的一个例子,我用一个模型,我说我要去利用(英文)的特征去界定我们的测试,这是基本的运营,我插入1+1等于2,就是这样。在这个案例当中,它可以获得assert可以进入到math,如果说你利用mathtest的框架,这样的输入的数据是不对的,你应该要嵌入等于,但是这里是没有关系的,我们就把(英文)作为一个普通应用的工具,他可以告诉我们要做什么样的工具。当我们去进行这样的测试的时候,我们可以获得这样的报告,你现在要去比较这两个数据,左边是这样的,右边是这样的,这块出现了故障,语言给开发人员提供了工具包,可以看到代码,我们做了什么工作。这是另外的一个例子,这里有一个库,我们叫做author,可以让我们去写下命令,这是一个非常简单的查询。如果大家要去熟悉queries 和.NET点击起来是比较难的,因为链接是嵌入到了语言当中,这是在sql上的例子。我们在数据库当中提出这样的要求,实际上我们如果运作不好的话,可能会出现安全的问题,我们现在是利用author 的代表去查询,它的表达的性能非常好,接下来我们要做的是确保它是安全的,不会有一些注入,我们要把这些author 的代码和sql的查询结合在一起,而且要同步的运行,这样不会影响到我们的效率。这些都是开发人员的例子,他们是运用author 并且把其他的结合在一起。这是我们的目标。
第三个就是生产力,生产力要进行衡量的话,是比较难的,当我们去研究的时候,它的代码线还有最后所开发出来的应用就更好一些,后来我们就想到了这样的想法,当然我们去比较一个编程语言和另外的一个编程语言比是比较难的,后来我们决定重点的关注几点,这几点会提高开发人员的生产力,如果说我们不进行很好的文件记录的话,我们最后的生产力不会特别高,这个给我们提供了很好的框架,而且我们必须要有好的packages的支持,这些包的支持非常的重要。我们要利用这样的解决方案来帮助我们解决问题。这里给大家举一个例子,我们来看一下这些记录,最后显示出来的样子就是这样的,我们是把一些都做了记录,明显的强调了计算,这个文件的记录是非常好的在所有源当中是一个非常好的bug,在这个项目之中我们就可以利用这样的文件记录的功能,这样的文件记录非常的重要,我们刚刚的学习这些语言,也要进行这些信息的记录。文件的记录必须是一流的,而且要产生,你要利用你的Id我们必须要去追踪一下它的计算,不管你是什么,都没有关系,这里有一系列的机器。我提到了包的管理,elixir ,是一个新的编程的语言,我们只有几年的语言,我们大约是1年半前有1.0版本,相对来说是一个比较好的语言,我们整个社区的发展是非常迅速的,这是我们的网址,我们有非常多的包,有1000多个包,已经下载了超过9千万次了我们在这样的编程领域当中发展得非常的迅速,如果大家喜欢我的发言,想要进一步的了解elixir,可以去我们的网站,我们有一个入门手册,在入门手册之中大家可以了解到更多关于elixir 的信息,如果大家想要深入研究的话,大家可以读这一本书,关于elixir 的书是特别多的,有三本书是我强烈推荐的,大家可以从我们的网站上下载,可以入门者变成高级者,最后我要感谢我的公司,谢谢我的公司在过去的5年之中给我提供的扶持,除了赞助了编程语言的开发之外,我们做的另外一件事情就是让公司来利用我们这样的一种语言,我们把它称为利用elixir 的公司,你可能会想,公司利用elixir 的时候会有什么样的状况呢?大家可以在谷歌上去搜索一下有一些关于elixir 应用的公司和一些 其他的开发商的公司,他们都是利用了elixir ,有非常多的使用的案例还有嵌入式的系统,大家去搜一下都能够找到。
我前面介绍了一些关键词,我希望能够说服大家能够利用这样的一个编程的语言,它不仅仅能够改变你对编程语言开发和使用的想法,而且会大幅度的改进你的工作。在21号的时候,2点半到3点十分的时候我还会在做一个发言,我希望在哪里能够见到大家,如果大家感兴趣的话,可以再次的听我的介绍,谢谢。
更多精彩内容,请关注新浪微博:@CSDN、图文直播专题: 2015中国软件开发者大会 。