`
pascal4123
  • 浏览: 115151 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Erlang风格的RPC

    博客分类:
  • FP
阅读更多

Erlang风格的RPC (2010-01-29 23:38) 


 

原文 http://armstrongonsoftware.blogspot.com.nyud.net/2008/05/road-we-didnt-go-down.html

 

Erlang中的RPC

最近,erlang的邮件列表中,我参与了一个非常有趣的讨论,Steve Vinoski和他的朋友们谈及RPC的一些"错误". 这个讨论开始与522,FaceBook宣布部署采用erlang编写的chat server.

 

Steve发表了一个回复说:“...多年的CORBA经验告诉我,使用RPC是一件非常困难,非常错误的事情.erlang风格的RPC却非常棒,因为erlang本身是分布式的.对于一般的语言,RPC带来的困难远远多于其解决的问题...”

后面出现更多的回复,我要求Steve详尽的解释其观点.

 

随后,Steve给出了丰富且有说服力的关于RPC问题的论述: "如果你没有很多的时间和精力,那么我告诉你,RPC的目标是使分布式的调用和本地调用尽可能的相似,但是这恰恰是其最根本的错误.因为远程调用和本地调用具有很多的不同..."

 

不错,不错,不错.当我读到这里时,在我的脑海里闪现出一连串的好,,.谢谢Steve!


Erlang
没有选择的道路 
Steve
过去曾深入研究RPC,并且感受RPC带给他问题,但是现在Steve站出来,告诉我们他曾经经历的一切.

 

对一个远程操作竭力地封装,使其看起来像本地操作,这就是RPC主要错误所在,因为远程和本地调用完全不同,我再次重申这个观点

在不是最坏的情况下,远程调用和本地调用对性能的影响也差别很大.一个本地调用可能仅仅需要几十微秒,而通过RPC远程调用可能会消耗几十毫秒。两者性能大约相差1000倍。

 

如果程序员不知道本地调用和远程调用间的不同,那么他很难写出高效的代码.如果其在软件内部掺杂了很多RPC调用,那么很有可能他的软件性能会饱受毁灭性的打击.

 

我曾将亲眼目睹很多工程的失败,正是因为参与者对远程调用和本地调用没有清晰的认识.

 

尤其需要注意的是,这种认识上的模糊对大型的项目的开发影响更坏.因为在较小的开发团队中,每个参与者都了解其使用的调用为远程还是本地调用.

 

Erlang如何实现RPC 
所有的erlang程序都是由很多并行的process组成, process可以创建其他的process,可以发送、接收消息。这些操作在erlang中都是非常轻量,高效的操作。

 

Process可以被连接起来(link),用来应对错误处理。如果Process AProcess B相连(通过调用link/1函数),A发生错误时,B会接收到一个错误信号,反之B发生错误时,A也会收到信号。Process连接机制,内部使用 Process的消息发送/接收机制。

 

当我们进行分布式系统开发时,需要多种形式的RPC调用。如果使用RPC,那么对于各种问题,RPC具有各种各种的规范及形式,严格的形式要求以及对错误的处理方式使应用RPC成为一场灾难。

 

Erlang的时间,通过sendreceivelink,开发者非常轻松的构建具有自定义错误处理功能的个人RPC”

 

Erlang中没有“RPC存根生成器,也完全没有必要拥有类似的生成器。

 

在很多程序中,可能仅仅需要一些简单的RPC调用,在Erlang中,我们可以这样实现:

rpc(Pid, Request) ->

    Pid ! {self(), Request},   

receive
            {Pid, Response} -> Response

end.

 

非常简单,这段代码首先发送一个请求,然后等待应答。

 

 

基于上面的代码,可以进行很多有用的扩展。简单的RPC在发送请求后,永远的等待应答,所以如果应答无法返回(比如远程主机crash,那么请求方会被永远的挂起。通过添加一个timeout可以轻松解决这个问题:

 

rpc(Pid, Request, Time) ->

     Pid ! {self(), Request},

     receive {Pid, Response} ->  Response

     after Time ->

         {error, timeout}

     end.

 

现在我们有了更高的要求。如果我们想产生一个exception,当与我们通信的远程主机die的时候,那么代码如下:

rpc(Pid, Request) ->

    link(Pid),

    Pid ! {self(), Request},

    receive

        {Pid, Response} ->

            Response

    end.

 

通过link/1函数,我们将自身processPid连接起来,确保远程主机出错,die时,本地Process也终止。

新任务,现在我们想并行执行两个RPC

rpc(Pid1, Pid2, Request) ->

    Pid1 ! Pid2 ! {self(), Request}

         receive {Pid1, Response} ->

             receive {Pid2, Response2} ->

                {Response1, Response2}

             end

         end.

 

 

 (不必担心这段代码是否工作,Response1Response2返回的顺序对代码没有影响)

通过上面的几个小例子,我想要说明的是:在Erlang中对于RPC的形式和规模以及错误处理,程序员可以进行各种精确的控制。同时上面的例子也说明,仅仅通过Process和消息,就可以很方便地更改RPC


标准RPC基于一个假设 -- 所有的应答都应返回给client

 

RPC框架中(比如SOAP),可能会有这样的处理:让X去做Y,最后把结果发送给Z。这在Erlang中也很容易实现:

rpc(tell, X, toDo, Y, reply Z) ->

    X ! {Z, Y}.

 

(在这里,我们固定发送的tuple消息中,第一个元素为希望得到应答的Process,第二个参数为要执行的动作。在文章开始的例子中,调用者等待应答,那么Z可以设置为self())

 

现在,我们要给我们的程序加上版本控制功能,也很容易:

rpc(Pid, Request, Vsn) ->

        Pid ! {self(), vsn, Vsn, Request},

        receive … end.

 

好了,通过这些例子,向您展现了版本控制,错误处理,同步执行,超时等等可以非常简单地添加到RPC调用中。通过消息接口,用户可以很轻松的定义各种交互。

 

最后,很多开发中通用的模式我们都为您准备好了,那就是OTP库。

 

分享到:
评论

相关推荐

    sshrpc:Erlang SSH RPC 模块(实验性)

    sshrpc 这是 sshrpc,一组用于 Erlang RPC over SSH 的实验性模块。 警告:此代码不应用于生产系统。 有关详细信息,请参阅src/readme.txt 。 此代码在下获得。感谢以下人员对本项目的帮助: Dave Smith(在 dizzyd....

    erlang_lpc:Erlang 的高度并行本地 RPC 式 pmap 执行框架

    LPC 的代码源自 Erlang 的 RPC 的 OTP 源。 它已被修剪和修改为仅包含在节点上本地执行 MFA 所需的基本要素。 最终结果是一个高度并行的本地 RPC 风格的 pmap 执行框架。 这意味着在 OTP 应用程序中使用,主管负责...

    Python-TamaleLua的erlang风格模式匹配库

    **Python-TamaleLua的Erlang风格模式匹配库** 在Python编程中,Tamale是一个独特的库,它为Lua语言引入了Erlang风格的模式匹配功能。Erlang模式匹配是一种强大的编程技术,允许程序员根据特定模式来解构值,这种...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    Erlang23_3.zip

    Erlang的语法简洁明了,函数式编程风格强调无副作用的纯函数,这有助于写出易于理解和维护的代码。 总的来说,Erlang23_3版本的发布为开发者提供了在Windows 64位和Linux平台上使用Erlang的新选择,包括可能的性能...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

    erlang25.0 windows版本

    Erlang是一种高级编程语言,特别适用于并发、分布式和实时系统。它由Ericsson公司开发,主要用于构建高可用性、容错性和可扩展性的软实时系统。Erlang的25.0版本是该语言的一个更新,针对Windows操作系统进行了优化...

    aberth:Erlang中的通用BERT-RPC服务器

    aberth-用Erlang编写的通用BERT-RPC服务器版权所有(c)2014 Aleksandar Radulovic。 版本: 0.9 aberth是Erlang中的通用BERT-RPC服务器。 它公开了常规的erlang模块,并使用作为TCP接受者池,当接受连接时,它提供...

    erlang22最新下载包

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。Erlang以其强大的并行处理能力、容错性和易于构建大规模分布式系统的特点,在电信、金融和互联网等...

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    Erlang/OTP 26.2.1

    Erlang/OTP 26.2.1,Erlang,OTP,26.2.1

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    Erlang 20.3linux安装包

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性、并发性和内存管理机制而被广泛应用于网络通信、数据库系统以及消息中间件,如...

    两本erlang电子书

    书中会详细解释Erlang的语法和编程范式,让读者理解其独特的函数式编程风格。同时,它也会涉及Erlang的并发特性和错误处理机制,使读者能够编写出可扩展且容错性强的代码。此外,这本书还会讨论Erlang的模块系统、...

    xiandiao_erlang_Erlang课后习题_

    【Erlang编程语言及其应用】 Erlang是一种并发式、函数式的编程语言,由瑞典电信设备制造商Ericsson开发,最初用于构建高可用性、容错性和可扩展性的分布式系统。"xiandiao_erlang_Erlang课后习题_"这个压缩包文件...

    erlang9.rar

    Erlang是一种高级编程语言,特别适用于并发、分布式和实时计算系统。它的设计目标是创建一个高可用性、容错性强、低延迟的系统。Erlang9指的是Erlang/OTP(Open Telephony Platform)的第9个主要版本。OTP是Erlang...

    erlang安装包.zip

    erlang安装包

    erlang23.2版windows64位.zip

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。Erlang因其在处理大量并发连接和容错能力上的优秀表现,广泛应用于电信、银行、互联网服务等领域...

    erlang otp25 win安装包

    erlang otp25 win安装包

Global site tag (gtag.js) - Google Analytics