基本信息
- 原书名:Erlang and OTP in Action
- 作者: (美)Martin Logan Eric Merritt (瑞典)Richard Carlsson
- 译者: 连城
- 丛书名: 图灵程序设计丛书
- 出版社:人民邮电出版社
- ISBN:9787115285591
- 上架时间:2012-7-18
- 出版日期:2012 年8月
- 开本:16开
- 页码:333
- 版次:1-1
- 所属分类:计算机 > 软件与程序设计 > 综合 > 综合
【插图】

编辑推荐
首部OTP开发部署实战指南
着眼于产品级代码开发
各级Erlang开发人员必备读物
内容简介
计算机书籍
《Erlang/OTP并发编程实战》侧重生产环境下的Erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位Erlang 大师多年的实战经验。
《Erlang/OTP并发编程实战》主要分为三大部分:第一部分讲解Erlang 编程及OTP 基础;第二部分讲解如何在实际开发中逐一添加OTP 高级特性,从而完善应用,作者通过贯穿本书的主项目——加速Web 访问的分布式缓存应用,深入浅出地阐明了实践中的各种技巧;第三部分讨论如何将代码与其他系统和用户集成,以及如何进行性能调优。
《Erlang/OTP并发编程实战》面向Erlang 程序员,以及对Erlang/OTP 感兴趣的开发人员。
作译者
Eric Merritt 专注并发编程和分布式系统。曾任职于Amazon.com,现为eCD Market软件工程师。Erlware联合创始人,Erlang芝加哥用户组核心成员。Erlware团队开源产品核心开发人员,Erlang/OTP构建系统Sinan的主要开发者。
Richard Carlsson 瑞典乌普萨拉大学高性能Erlang计划(HiPE)早期成员,研究Erlang技术达17年,曾为标准库、Erlang编译器、运行时系统和Erlang语言本身都作出过不少贡献。此外,他还是Erlang文档系统EDoc和单元测试框架EUnit的创建者。目前加入了Kreditor,致力于高可用性支付系统的Erlang开发。
连城 百度资深软件工程师,《Erlang并发编程(第一部分)》社区翻译项目组织者及主要译者。对分布式存储、分布式消息系统、程序语言设计实现抱有浓厚兴趣。
目录
第一部分 Erlang起步:OTP基础
第1章 Erlang/OTP平台 2
1.1 基于进程的并发编程 3
1.1.1 理解并发 3
1.1.2 Erlang的进程模型 4
1.1.3 4种进程通信范式 5
1.1.4 用Erlang进程编程 8
1.2 Erlang的容错架构 10
1.2.1 进程链接如何工作 10
1.2.2 监督与退出信号捕捉 10
1.2.3 进程的分层容错 12
1.3 分布式Erlang 13
1.4 Erlang运行时系统和虚拟机 13
1.4.1 调度器 14
1.4.2 I/O与调度 15
1.4.3 进程隔离与垃圾回收器 15
1.5 函数式编程:Erlang的处世之道 16
1.6 小结 16
第2章 Erlang语言精要 18
译者序
一年多之后,Facebook发布了基于XMPP的即时通信服务Facebook Chat,所用的服务器正是经过定制的ejabberd 。刚好那段时间正在琢磨分布式一致性相关的问题,迫切需要一门便于实现分布式算法的语言。于是我开始在官方文档和Concurrent Programming in Erlang的指引下学习Erlang。很快我便发现,只要适应了尾递归和单次赋值等函数式编程的特点,Erlang语言本身非常地简单明了。经过初步的摸索,对Erlang的认识也逐渐完整起来。最初以为这是一门阳春白雪的学院派语言,后来却发现大错特错。自打诞生之日起,Erlang就是一门目的性和工程性极强的语言。它的特性集合历经电信行业的千锤百炼,几乎不带一丝一毫的水分。尤为有趣的是,正如本书简介中所述,Erlang的历史与工程型语言的另一典范C惊人地相似。但是,由于思想过于前卫,这门优秀的语言却一直未能受到足够的关注。在服务器端的开发者们都在兴致勃勃地探讨如何通过避免内存复制来提高单机性能时,复制式消息传递简直就是异端邪说!过去十年间,并发处理的复杂性已经随着硬件瓶颈的到来而凸显出来。然而,对于一线应用的开发者而言,近年来大规模互联网应用的爆炸式增长才切实将并发处理变成了一个亟待解决的现实问题。
没想到很快冷水便劈头盖脸地浇了下来——Erlang的并发、容错机制只是整个体系的基石,要想真正发挥出它们的威力,还要仰仗一套叫做OTP的东西。这玩意儿可真是折腾死人了!OTP行为模式迷宫般的回调逻辑把我绕得晕头转向;在解决具体问题时,我总是搞不清楚到底该用gen_server、gen_fsm还是gen_event;好不容易在Erlang shell里跑通一段代码,想打包部署到其他机器上做多机实验时又撞了一头包:应用、发布镜像、变幻莫测的配置项、漫天飞舞的版本号、语焉不详的官方文档……所有这些魔鬼般的细节无不蚕食着我所剩不多的耐心。
译完本书之后再回过头来看,其实OTP的核心概念并不复杂,当年最让我搓火儿的还是实战过程中各种剪不断理还乱的繁琐细节。Erlang/OTP的官方文档并不缺细节,但这些细节却水银泻地般地散落在各个角落里,缺乏一条将它们有机地贯穿起来的主线。梳理这一主线,正是本书的任务。全书以交付产品级代码为目标,以一个现实而鲜活的虚拟项目为舞台,深入浅出地讲解了OTP中最为重要的机制和概念,并清晰地呈现了它们之间的内在联系。如果说 Erlang/OTP的官方文档是个繁华的大都市,那么这本书就是一本地图。明白了关键机制和概念之间的内在联系之后,按图索骥深入学习Erlang /OTP就不再是什么难事了。
既然是译者序,那么再说说译书的那些事儿吧。2009年至2010年间,我在Erlang China社区内发起了CPiE-CN项目,召集了一批志愿译者共同完成了Concurrent Programming in Erlang (Part I)中文版《Erlang并发编程(第一部分)》的翻译。后来,正是这一项目促使我成为了本书的译者。在此我要对CPiE-CN的几位志愿译者表示感谢,他们是王飞、赵宇坤、张驰原、丁豪、赵卫国和吴峻。在本书近一年的翻译过程中,我要感谢图灵教育的傅志红老师、李松峰老师和刘美英老师的帮助,感谢他们容忍了我非常规的交稿方式(以及蜗牛般的进度)。我还要感谢几位协助校对部分中间译稿的早期读者,他们是赵卫国、田中博和倪华杰。最后,特别感谢我的妻子雅莉:这一年中,本职工作的繁重程度远远超出了我的想象,所剩不多的业余时间完全被这本书消耗殆尽,如果没有她的支持和监督,身为重度拖延症患者的我也许根本就坚持不下来。
好啦,闲话少说,预祝各位读者在享用本书的过程中玩儿得开心!
前言
本书三位作者长期从事Erlang相关工作,但各自的发展轨迹却很不一样。
Martin:“我是在自己第一份‘真正’的工作中接触到Erlang的。此前我一直从事C和C++开发,也有意思得很。我的第一任老板Hal Snyder甚至在20世纪90年代便对多线程深恶痛绝,后来邂逅了Erlang。我那时还只是个实习生,于是他给了我一个要用Erlang完成的项目。原因嘛,嗯,无非是我的工钱低,即便我搞砸了,公司在这桩买卖上的损失也就不过70美元。最后我并没搞砸,我自己写了一个1000行的监督进程,代码不好看,因为那时候我压根儿不知道OTP是什么东西,手边当然也不会有相关的书。在这个过程中,我爱上了这种‘靠谱’的开发后端系统的方法,也爱上了Erlang。Erlang给了我洞悉未来的机会:我所写的复杂分布式系统,所用的高级算法,都是我那些使唤着命令式语言的同事们所梦寐以求的,不花上两年工夫码上一百万行代码他们压根儿实现不出来。读了数千页文档,写了数万行代码之后,我依然钟情于它。一路走来,我遇到了许多杰出的人物,能与其中的两位共同撰写本书令我激动不已。2004年我在ACM会议上发言时遇到了Richard,四年后我又遇到了Eric,并和他一同创建了Erlware——一个仍在蓬勃发展中的项目。多年来,Erlang在我的职业生涯和个人生活中一直扮演着重要的角色,今后也仍会如此。”
Eric:“我研究Erlang完全是无心插柳。我曾想写一款大规模多人游戏。然而我明白,仅凭一人之力,即便是才华横溢,也干不完所有图形处理的活儿。于是我决定集中精力主攻游戏逻辑部分,觉得借助于合适的工具和语言我应该能解决这部分问题。在我的设计中,我喜欢在游戏中设立多个代理对象,每个代理对象都能随时间自主学习并独立而并发地行动。那时我能想到的唯一可行的办法,就是把每个代理对象都建模为某种并发的东西,但当时我还不知道这个东西是什么。我所掌握的语言没法让一个开发者单枪匹马拿下这么一款游戏。于是,我开始考察各种语言,前前后后一共花了大概五年时间,作了一些深入的研究。我很早就见识过Erlang,虽然很喜欢它的并发特性,但实在受不了它的语法和函数式特质。直到考察了很多编程语言之后,我才重新开始欣赏Erlang并用它编写代码。那款游戏我一直也没能写成,但我确信选择Erlang没有错,经过深入的研究和剖析,我发现这门语言在许多方面都大有用武之地。这大概是2000年或2001年的事情了。后续几年间,我又自学了OTP。后来,在2005的时候,我在Amazon.com引入了Erlang,发布了Sinan的第一版,还认识了Martin Logan,并和他一起创办了Erlware。2008年,我搬到了芝加哥,开始写书并尽心打理Erlware项目。”
Richard:“我大概是在1995年前后接触Erlang的,那时我正在乌普萨拉大学为计算机科学硕士论文选题。这引导我后来成为高性能Erlang研究组的一名博士研究生,就Erlang编译器和运行时系统做了若干年的研究。我在瑞典和美国的会议上结识了Martin Logan和Eric Merritt,他们对Erlang的热情令我印象深刻,尽管那时候Erlang还是一门鲜为人知的语言——尤其是在美国。在攻读博士学位期间,我搞了几个业余项目,其中语法工具库和EDoc应用都源自我在编译器方面的研究成果,而EUnit原本是为了检查我的学生们的并发编程作业是否符合规范而设计的。走出学术界之后,我做了几年和Erlang无关的工作,基本上都是在用Python、Ruby和C++写程序。不过最近,我加盟了瑞典最成功的一家创业公司,再次全职投入Erlang,目前正投身于高速发展的高可用性支付系统领域。”
我们三人努力从共同的经验中提炼出尽可能多的内容,以便让你在迈向大师级Erlang程序员的道路上少走弯路;我们也希望能借助本书,最终让OTP框架成为每个Erlang程序员——而不是少数能将手册翻烂的人——都能掌握的东西。
序言
在Erlang中创建进程易如反掌——这就像是在Java等语言中创建对象一样简单。进程变得如此廉价,使得我们得以从不同的视角来看待系统。Erlang程序中的任何独立活动都可以被视作单独的进程。没有晦涩的事件循环,也没有线程池,所有这些烦人的实现细节统统都可以抛开。即便程序需要同时运行10 000个进程来完成某个任务,也可以轻松搞定。阅读本书时你会发现,Erlang可以极大地改变我们看待系统的方式。我们希望让你看到,系统可以以更直观(也更高效)的方式得以呈现。
Erlang还是一门函数式编程语言。别害怕,Erlang完全可以设计得更贴近你所熟悉的那些主流语言;即便不借助函数式编程,这里记述的各种特性也一样可以实现。但函数式编程所具有的引用透明性、高阶函数、不可变数据结构等几大特点,它们本身就很值得引入Erlang。函数式编程简洁优雅地融合并呈现了这些特点。要不是引入了函数式编程,Erlang只会变得更为复杂,也不可能那么令人愉悦。
Erlang诞生记
你头一回听说Erlang时,它多半是被定性为一门“函数式并发编程语言”,而你大概也会觉得它听起来更像是某种学院派的、不实用的玩具语言。但我们要强调的是,Erlang从一开始就致力于解决真实的大规模软件工程问题。为了把话说清楚,我们得先好好聊聊这门语言背后的历史。
与C比较
Erlang和C语言的背景颇为相似。首先,二者都源自大型电信公司,都是由某个环境相对轻松的研发部门里的几个人创造出来的。两门语言的创造者都是自在之人,但他们同时也都是试图去解决具体问题的务实的工程师。对于C来说,要解决的问题是如何在硬件资源受限(相对那时而言)的情况下,用比汇编更高级的语言来开发系统软件。对于Erlang来说,问题则在于如何让程序员开发超大规模、高并发和强容错的软件,并彻底改善生产效率、减少软件缺陷的数量——这可真不是闹着玩儿的。
两种语言的第一批追随者都来自公司内部,这些人在各种内部项目和实际产品中使用它们,并就各种务实的细节向语言的缔造者们提出了宝贵的前期反馈。二者都花了大约十年时间才为公众所知,而在此之前,它们都出色地经受住了实战的检验。C诞生于1972年左右,流行于20世纪80年代。同样,Erlang成形于1988年,直到1998年才以开源的形式对外发布。在公司外部,两种语言先点燃的都是研究机构和大学的兴趣。当然,出于历史原因它们各有各的缺点,但一般来说我们并不在乎,因为也只有它们真正地解决了问题。
让我们把目光转向过去。
20世纪80年代中期,斯德哥尔摩:那个自由散漫的英国人
Erlang诞生自一个研究项目,该项目旨在寻求一种更好的编程方式,用以开发当时电信业内那些大流量、高并发、猛龙一般永生不死的控制系统。Joe Armstrong 于1985年加入这个项目,来到了位于瑞典斯德哥尔摩的爱立信计算机科学实验室。
这个项目的主要任务就是用尽可能多的编程语言来实现同一类通话控制系统。涉及的语言包括Ada、CLU、Smalltalk等。最终的结果结论性并不强,虽然很明显上上之选是用函数式和逻辑语言并采取高级的声明式风格来进行开发,但当时还没有哪种语言具备合适的并发模型。
但谁知道好的并发模型是个什么样呢?那时(以及之后近二十年间),并发方面的主要研究要么集中在CSP、pi演算这样的纯抽象进程模型和并发逻辑语言上,要么就集中在信号量(semaphore)、监视器(monitor)和信号(signal)这类底层机制上。
与此同时,工程师们仍然要解决各种大规模并发容错通信系统的实际问题。当时的爱立信已经有了独门秘籍,那是一套专有的揉合了编程语言和操作系统的混合解决方案,名为PLEX,AXE电话交换机的成功就要归功于它。
让人抓狂的需求
PLEX是一门相对常规的命令式编程语言,但它为后继者立下了一系列标杆:
进程必须是语言的核心;
任何进程不得损坏其他进程的内存空间,不得遗留悬空指针;
由于要同时跑数万乃至数十万个进程,进程创建和任务切换的速度必须要快,单个进程的内存占用量必须非常小;
必须能够隔离单个进程的故障;
媒体评论
——Amazon.com书评
“多核处理器和并发编程是将来的重头戏,Erlang在下一代编程语言中可谓独领风骚!”
——DZone书评
“Erlang开发者必备两本书,一本是Erlang之父Joe Armstrong的《Erlang程序设计》,另一本就是本书——务实、高效又不失幽默风趣的好书啊!”
——slashdot.org书评
书摘
本章概要
理解并发和Erlang的进程模型
Erlang的容错与分布式支持
Erlang运行时系统的重要属性
什么是函数式编程,如何用Erlang进行函数式编程
既然你正读着这本书,想必知道Erlang是一门编程语言——而且还是一门很有意思的语言,但正如书名所示,我们所关注的是如何用Erlang创建真实而鲜活的系统。为了实现这一目标,我们就需要OTP框架。Erlang的任何发布版本都带有这套框架,它与Erlang紧密集成,已令人难以将之与普通Erlang标准库明确地区分开来。因此,我们常用Erlang/OTP来同时指代二者或其中之一。尽管二者间的关系如此密切,但真正明了OTP的用途与运用之道的Erlang程序员却为数不多,即便真相往往只有一步之遥。就让本书来为你带路吧。
OTP是什么意思
OTP最初是开放电信平台(Open Telecom Platform)的缩写,Erlang开源前这个名字多少还有点品牌效应。如今可没人稀罕它了;现在OTP就是OTP。无论Erlang还是OTP都早已不再局限于电信应用:更贴切的名字应该是“并发系统平台”。
作为编程语言,Erlang可以简化高度并行分布式容错系统的构建,并以此闻名。在跳到OTP框架相关内容之前,我们会先在第2章对该语言作一个全面的综述。不过话说回来,为什么非学OTP不可呢?或许你更乐于埋头实现自己的解决方案?且让我们来看看OTP的优点:
生产效率——运用OTP可在短时间内交付产品级的系统;
稳定性——基于OTP的代码可以更集中于逻辑,并避免重新实现那些容易出错而每个实际系统又都必备的基础功能,如进程管理、服务器、状态机等;
监督——这是由框架提供的一套简便的监视和控制运行时系统的机制,既有自动化方式,也有图形用户界面方式;
可升级——框架为处理代码升级提供了一套系统化的模式;
可靠的代码库——OTP的代码坚如磐石并全部经过严格的实战检验。
尽管有诸多优点,但恐怕对大部分Erlang程序员来说,OTP仍然神秘莫测,必须在艰涩的文档中摸爬滚打千锤百炼方能习得。而这正是我们所要改变的状况。据我们所知,本书是第一本专注于OTP学习的书,而我们想要告诉你的是这一过程远比你想象的要轻松。我们保证你学了肯定不会后悔。
在本书结束时,你将完整地掌握OTP框架中的概念、库与编程模式,学会如何运用OTP的组件和理念开发单个Erlang程序及整套基于Erlang的系统,并令其兼具容错、分布、并发、高效和易于监控的特点。你可能还会学到一些此前未曾留意过的有关Erlang语言、运行时系统、库和工具的细节。
本章我们所要讨论的是Erlang/OTP平台中的那些用于构建OTP本身的核心概念和特性,包括:
并发编程;