让我们来看一下刚才所描述的Erlang成功的几个因素。爱立信第一个主要的Erlang产品是AXD301 ATM交换机。而最近,Erlang是实现“无模式”面向文档的数据库CouchDB的关键所在。最后,我们通过一个摩托罗拉主导的研究项目来比较Erlang和C++的效率。 AXD301 ATM交换机 AXD301是一个电话级10-160 Gbps的ATM交换机,从设计到实施总共用了不到三年的时间。AXD301的核心包括了超过150万行的Erlang代码,它们负责处理所有复杂的控制逻辑,并监控运行和维护。它还集成了约50万行的C/C++代码来实现低级别的协议和设备驱动器,其中的大部分来自第三方库。 这种ATM交换机已经安装在世界各地的网络中,但最有名的是用在英国电信的一套系统,这也是迄今为止全世界最大的一套“Voice over ATM”的骨干系统。 援引爱立信在试验最后阶段发表的新闻稿,“由于在2002年1月削减BT网络的第一节点时发生了一个轻微故障,导致可用性为99.9999999% ”,爱立信下一代系统程序的负责人Bernt Nilsson是如此证实的:“这个网络性能是如此可靠,以至于我们有现场工程师几乎没有学到任何维护技能的风险。” 根据AXD301的经验我们可以说,“五个九”的高可用性,包括升级在内的软件停机时间,是一个更实际的评估。对于无间断运行,你需要多台计算机、冗余电源、多个网络接口和可靠的网络,永不失效的冷却系统和不会绊倒系统管理员的连接电缆,毫无疑问还需要有很好的具有实践经验的维修工程师。使用传统的编程语言需要通过更多的努力达到这个目标,但我们仍然为Erlang所达到的这一切感到非常自豪。 Erlang为AXD301的成功作出了什么贡献呢 ?它支持增量开发,没有边界效应,让你更轻松地添加或修改单个部件。从一开始Erlang语言就内置地支持健壮性和并发性。 Erlang很受编程团队的欢迎,因为他们发现它很适合编写更紧凑的代码,从而极大地提高他们的工作效率。根据项目经验,虽然不是科学的记录,Erlang代码4~10倍少于类似的用C/C++、Java或者PLEX编写的代码,而每千行代码的故障率是一样的。 爱立信已经将Erlang运用在公司的其他项目上,包括SIP电话协议栈、无线基站的控制软件、电话网关控制器、媒体网关、宽带解决方案、GPRS和3G的数据传输。而这些仅仅是其中几个我们所谈到的例子而已。 CouchDB 当Damien Katz决定开发CouchDB的时候,他希望能够成为开发“很酷的东西”的一员。他想看看是否自己足够棒,能将某些代码从零开始开发,并把它推到一个新的高度。CouchDB是一个开源数据库,它提供了一个“无模式”的文件存储仓库,以JSON格式存储对象,并通过一个RESTful接口来存取数据。 他写的CouchDB的第一个版本采用的是C++语言。这个系统包括三个部分:存储引擎、查看引擎和查询语言。组件的复杂性渐渐增加,而当开始触及并发问题的时候,他觉得自己处处碰壁。后来他偶然发现了Erlang,下载了它,并迅速意识到它完全可以解决他的那些问题。 从Damien的角度来看,Erlang一开始听起来非常复杂,他也认为,学习Erlang肯定也是非常艰难的。但当他接触到细节的时候,让他惊讶的是这门语言的简单性。与Java相比,用Erlang工作要耗费更多的精力,因为只有较少的工具和可以使用的集成开发环境(IDE),但他知道,要开发能可靠工作的系统,Erlang比使用其他语言需要更少的时间和精力。 Erlang给了Damien开发CouchDB所需的特性,而付出的代价只是使用传统编程语言所需代价的一小部分。当迁移CouchDB至Erlang的时候,他重点致力于并发方面并把它融入到现有的C++组件中。当Erlang具备了他所需要的数据库应用的所有特性的时候,他最终用Erlang取代了整个C++代码库。这包括支持密集的I/O、高可靠性和优雅处理故障的工具。代码的第一个性能测试,即使在它优化之前,已经允许超过20 000个同时连接。而同样情况下如果用C++来实现,只能达到500个。 CouchDB发布以后在开源社区中马上获得了大量的关注。Damien决定通过Apache许可证发布代码,这样他可以继续自由地发展它。今天,CouchDB已经成为当今全球产品级系统中使用的较为出名的Erlang开源软件之一。 Damien后来怎么样了呢?他在IBM得到一份工作,允许他将CouchDB作为一个开源项目继续发展。用Damien的话来说,他现在的确是为“很酷的东西”而工作的一个人了。你可以在http://www.couchdb.org中阅读更多关于CouchDB的内容。 比较Erlang与C++ 最有经验的Erlang程序员证实,他们已经写过的Erlang程序大大短于其他对等竞争的业界大规模使用的主流编程语言。在Erlang宣布开源之前,这的确在爱立信编程员中广为流传。 但直到最近,也几乎没有科学证据来支持这些说法。但使用列表解析的快速排序算法(参见第9章)或者远程过程调用服务器的例子(参见第11章),这两种情况都出现在我们这本书上,且都证实了这种情况。当比较编程语言的时候,无论如何,你必须在这些语言针对的应用领域,对整个系统做性能评测,而不是以代码片段或简单的功能去衡量。 英国的Heriot-Watt大学得到了工程和自然科学研究理事会的赞助,用来研究分布函数式编程语言对电信业的影响。当我们第一次听到这个消息时,我们的反应是,为什么不和爱立信一起去研究呢?当我们意识到这个研究项目是在和爱立信的竞争对手 —— 摩托罗拉实验室一起合作开展的时候,我们的想法就迅速改变了。虽然Heriot-Watt大学可能相信爱立信的话:Erlang适合电信应用编程,可是摩托罗拉可不这么认为。 研究的重点包括两个C++语言为基础的系统,涉及数据移动性(Data Mobility,DM)组成部分和派遣呼叫控制器(Dispatch Call Controller,DCC)。这些系统就像处理紧急呼叫服务一样为袖珍无线电系统处理数字通信流。开发DM时牢记了的容错性和可靠性。它的实现是由专业的C++编程人员在摩托罗拉专有类库的基础上进行开发的。DCC是一个内部研究的原型,它用于评估使用C++和CORBA来获得可扩展性的性能。 Erlang的重写由Jan Henry Nyström执笔,他是一位有着专业学术背景且经验丰富的Erlang程序员。对DM进行了两次Erlang的重写,而对DCC只进行了一次。第一次DM的实现与摩托罗拉的类库进行了连接,而第二次是一次纯粹的Erlang语言的实现。DCC是一个纯Erlang的实现。针对基于语言的性能、稳定性、生产力和编程语言结构的影响,进行了比较。 纯Erlang的实现给这个研究带来了有趣的结果。DM中的代码减少了85%。这一点事实可以证明:27%的C++代码为防错性程序而设计,11%用于内存管理,23%用于高级别的通信,而在Erlang中所有这些特性都是语义的一部分,或者在OTP类库中已经实现了。而DCC的代码只有和其相对应的C++代码的70%左右。 结果Erlang DM与C++的版本相比性能提升了100%,而后者当严重超载的时候就会崩溃。尽管最初的流量令人惊讶,但轻量级并发模型是解决任务的正确工具。与之相关的移动应用包括大量的并发和短消息,而关于复杂处理和数字运算方面则很少。C++一直没有针对它所处理的负载进行设计,因此最后的结论往往是,这些负载的结果可能是不相关。但无论如何,它们展示了Erlang语言作为基础系统的重要特性,那就是在超负荷的情况下保持稳定,并且当工作量下降时能够自动恢复。 尽管Erlang开拓者认为他们简短且紧凑的代码是建立在经验的基础上的,这个研究最后提供了实例数据证实了这一点。一份题为“高级分布式在快速开发健壮电信软件中的应用:比较C++和Erlang”的报告充分肯定了“Erlang的优势”。
Erlang编程指南——案例研究
书名: Erlang编程指南
作者:
出版社: 机械工业出版社
原作名: Erlang Programming
译者: 慕尼黑Isar工作组 | Simon Thompson
出版年: 2011-3
页数: 444
定价: 79.00元
装帧: 平装
ISBN: 9787111303251