- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编写分布式的Erlang程序陷阱和对策(中文版)p37svenssoncn.pdf
编写分布式的 Erlang 程序:陷阱和对策
Hans Svensson
Dept. of Computer Science and Engineering
Chalmers University of Technology
Gothenburg, Sweden
hanssv@cs.chalmers.se
Lars Åke Fredlund*
Facultad de Informatica, Universidad Politecnica de
Madrid, Spain
fred@babel.ls.fi.upm.es
摘要
为了在Erlang 运行时系统基础上开发更可靠的分布式系统和算法,我们研究了 Erlang 编程语言中
分布式的部分。使用 Erlang ,把一个运行在单个节点上的程序转换成完全分布式(运行在多个节点
上)的应用程序可谓易如反掌(只需要修改对spawn 函数的调用,使之在不同节点上产生进程);
但尽管如此,Erlang 语言和API 中仍然有一些阴暗的角落可能在引入分布式运算时带来问题。在本
文中,我们将介绍几个这样的陷阱:在这些地方,取决于进程是否运行在同一个节点上,进程间通
信的语义会有显著的差异。我们同时还提供了一些关于“编写安全的分布式系统”的指导原则。
分类和主题描述 D.3.3 【编程语言】:语言构造和特性
关键字:可靠性
1. 简介
我们希望能够编写和调试用到 Erlang 的分布式进程通信机制的分布式算法,为此我们必须清楚
Erlang 的分布机制对进程间通信提供了哪些保障——要判断这些保障是否与我们的分布式算法的各
种需求相符,首先必须了解它们。很大部分的研究工作都是在为 Erlang 编程语言(包括分布机制)
开发形式化语义[CS05] 。在实现“分布式Erlang”的模型检查器[FS07] 时,我们有几处无法完全肯定形式
化语义是否精确描述了 Erlang 分布层的行为。但由于并非所有关于分布式支持的重要部分都有文
1
档记录 ,做一些试探工作自然是必不可少的。我们编写了大量程序来测试运行时系统的各种基本
特性,同时对运行时系统的源代码也做了检验,从而逐渐勾勒出 Erlang 语言中分布式部分的真实
行为。
我们得到的成果是另一篇关于精化 Erlang 分布式语义的论文[SF07] ,以及本文:我们将在文中着重关
注Erlang 目前提供的分布式支持带来的实际效果——我们将展示哪些代码会出错 ,并就 “如何借
助 Erlang 的分布机制编写可靠的分布式应用”提出我们的建议。
* 该作者 由西班牙教育与科学部提供的拉蒙卡哈基金 (Ramón y Cajal grant )和
DESEFIOS (TIN200615660C0202 )、PROMESAS (S0505/TIC/0407)等项 目共同资助。
1 然了,有源代码,如果那也算文档的话……
2. 节点内编程
Erlang 节点内编程的基本工具可说是人所共知了:用send 和receive 来实现通信;用链接 (link)
和监视器(monitor)来构造健壮的、在单个进程失败时也不会崩溃的应用程序。
正如前文所说 ,链接 (link)和监视器(monitor)是编写具有高容错性的 Erlang 程序的基本工具 :
借助这两种语言特性, 一个进程终止时,它可以向另一个进程发送失败信息。在分布式应用开发
中有一个常见的抽象机制叫做失败侦测器(failure detector ),其用途跟 Erlang 的链接和监视器毫
无二致。
请注意 ,“链接和监视器”机制——监视同一节点上的另一个进程——并不保证被监视的进程在语
义上正确:被监视的进程有可能在等待一个永远不会到来的消息 ,这时它实际上等于已经死掉了,
但监视它的进程永远也不会收到“进程终止”的消息。为此(以及其他一些原因)有必要用计时器
(timer )来限制进程通信的等待时间,即便各个进程都在同一节点内。
下面我们将逐一展示节点内通信能够得到的基本保障。
2.1 基本消息传递保障:流语义
节点内消息传递的基本保障是:由一个进程发送给另一个进程的消息 ,只要消息能够送达而没有丢
失或重复 ,就必定是按发送顺序送达的。在这里 ,“将一条消息送达进程 P”意味着这条消息被放
入进程P 的收件箱 ;同时只要消息 m 被送达 P ,我们就说 P 收到了消息 m 的值——这并不代表 P
在此时用receive 语句从收
文档评论(0)