面对软件错误构建可靠的
分布式系统
(瑞典)Joe Armstrong 撰
段先德 译
邓 辉 审
<声明:本文版权属原文作者所有,译文仅用于个人学习和交流,不得用于任何商业目的。>
原文链接:http://www.erlang.org/download/armstrong_thesis_2003.pdf
译 感
近年来,“多核”、“分布式计算”、“集群计算”、“大并发量处理”等名词逐步从实验室中的概念走向了大众社会的应用,并给许多公司带来了商业上的巨大成功。一个新的信息处理时代已经悄然来临,召唤着新的适应这个时代的软件开发方法和工具。其实早在1986年,在Ericsson就有一些专家开始了如何编写出可靠的分布式系统方面的探索和研究。这些研究成果,成就了可靠性达到99.9999999%的目前世界上最复杂的ATM交换机,并给我们带来了Erlang/OTP这套开源的开发工具和平台。Joe Armstrong先生就是Erlang的主要发明人,而本文就是Joe Armstrong的博士论文。
之初学习Erlang编程的时候,为了深入了解一下Erlang的设计哲学,我决定把这篇论文精读一遍。我想无一遗漏地精读的方式,就是把它翻译一回。 邓辉 先生(《敏捷软件开发——原则、模式与实践》中文版译者)鼓励我说,翻译吧,也算是给国内的Erlang这个小圈子做点贡献。于是似乎有了一些责任。既然是要公开出来的,任何细节就更不能毛糙了,也就迫使我查阅了许多背景资料,而这些论文以外的知识对于我平时的Erlang编程颇有助益,算是意外之得了。
跟其他的理工类博士论文不一样,本论文并没有堆砌大量的公式推导,而是以平铺直叙的方式,在解答“如何在存在软件错误的情况下编写出具有合理行为的软件?”这一核心问题的过程中,详细地阐述了Erlang/OTP的设计哲学。论文分析了构建可靠的分布式系统的一些系统需求、语言需求、库需求,介绍了完全针对这些需求而打造的JAM系统、Erlang语言和OTP开发库。本论文的重点不在于JAM的设计,不在于Erlang语言的描述,也不在于OTP库的介绍,虽然这些方面都有很多值得讨论的课题。本论文把重点放在了可容错的架构上,如何构建软件运行的模型?如何进行错误检测和恢复?如何实际编写出可容错的系统?本文的重点在于探讨这一系列的设计思想的问题。这是一门软件开发哲学,也是一个软件世界观。
不得不提的是“一切皆进程”的Erlang世界观。作者把软件所有要处理的事务划分成一系列层次化的任务,每个任务有一个“强隔离的进程”来执行,进程之间没有任何共享状态,只能通过“消息传递”来通信。这种“强隔离的进程”
不仅可以更真实地描述现实世界的信息处理过程,还成为软件错误发生时保护系统的可靠性的最有力模型。
也要说说本论文关于故障处理的论述。由于业务处理都在一个个“强隔离的进程”中——作者把它们称为“工作者”,就防止了一个进程出错会传播到其他的进程。业务处理进程的运行状况由另外专门的进程来看护——作者把它们称为“监视者”。“工作者”和“监视者”组成一个层次化的监督模型,使得一个进程发生故障时,整个系统可以作出相应的调整,保障系统最大限度地提供服务。
还要说说behaviour。本论文无意中介绍了OTP库集中的behaviour库的设计思想,即将程序的并发处理和顺序化处理分开。本文还以gen_server为例,展示了如何把并发部分抽象出来,如何让程序从最初的“脆弱”演化到“可容错”,体味一下,会受到启发。
罢了罢了,关于本论文的内容我不能说太多,言多必失,恐怕淡漠了任何一方面,也许每个人看到的重点都不一样。总之,非常感谢Joe Armstrong给我们奉献了这篇论文。
在本译稿完成的时候,Joe Armstrong关于Erlang编程的的新书《Programming Erlang》也已经出版面世了,引起了软件开发主流们不小的震动,Ralph Johnson甚至预言Erlang会是下一个Java。不管这种预言会不会成真,想深入学习Erlang编程的朋友一定不要错过这部伟大的著作。
非常感 谢邓辉 先生,他详细地审阅了本译文的初稿,提出了许多宝贵的意见,使得本译文更贴合论文原意。
无论我怎么努力,终究水平有限,肯定还存在许多对原文理解错误或中文表达欠妥之处,恳请读者指正。译者联系方式:sanderisme@hotmail.com。
段先德
2007年9月 上海
面对软件错误构建可靠的
分布式系统
(Making reliable distributed systems in the presence of software errors)
2003 年 11 月 20 日 最终修订版
Joe Armstrong
本论文作为工学博士
学位之要件提呈皇家技术研究院
瑞典·斯德哥尔摩
皇家技术研究院
2003年12月
微电子与信息技术学部
献给Helen、Thomas和Claire
摘要
本论文所描述的成果源于1981年开始的一个研究项目,该项目的目的是探索更好的编写电信应用软件的方法。电信类应用都是一些大型的程序,虽然经过了严密的测试,但是投入运行后还是难免会有许多错误。我们假设这些程序不可避免地会含有错误,进而寻求在软件包含错误的情况下构建可靠系统的方法。
该项研究的成果是开发出了一种新的编程语言(叫做Erlang),一门设计方法学,和一个用以构建健壮系统的程序库(叫做OTP)。就在本论文写作的时候,本文所描述的技术已经在Ericsson和Nortel的多款主流产品中被使用。也许还有许多小型公司正在为了发掘这一技术而成立。
本文主要关注的是在程序自身包含有错误的情况下如何构建出可靠的系统这一问题。构建这样的系统对所采用的任何一种编程语言都有一些特殊的要求。这里会讨论这些对语言的具体的特殊要求,并将展示Erlang是如何满足这些要求的。
这些要求可以在编程语言中解决,也可以在语言所附带的标准库中解决。我将论证在构建可容错系统时,哪些要求应该在语言中解决,而哪些要求可以在标准库中解决。这些合起来构成了构建可容错软件系统的基础。
实践见真章,没有得到实践证明的理论是不完整的。为了证明这些思想在实践中确实有用,我也列举了许多已经在大型上列产品中成功应用该技术的案例。到目前为止,使用该技术的最大的项目是Ericsson的一款重要产品,它包含超过100万行的Erlang代码。这款产品(AXD301)也是公认的Ericsson最可靠的产品之一。
最后,我印证了一下我们是否达到了寻找一种编写电信应用软件的更好的方法的目的,我还指出了我们的系统可以在哪些方面进行进一步的提高。