Erlang:远程呼叫与发送消息

时间:2012-09-20 08:13:21

标签: erlang message rpc

我想在远程节点上执行某些过程。而且我不确定哪种方法最好。我可以写rpc:call来做这件事。或者通过Remote ! {call, some_procedure}向节点发送消息以启动该过程并使用receive等待响应。那么在erlang中哪种方式更好?或者它们实际上是用于不同的用途?

2 个答案:

答案 0 :(得分:11)

最好使用模块rpc,因为如果你不这样做:你必须管理远程节点的监控,必须提供呼叫的唯一ID,处理超时,你也'必须为函数结果提供回送响应的包装器。

所有这些操作都是通用的,并在rpc模块中实现。

顺便说一下,远程调用有不同的变体,它们在rpc中实现:同步异步调用强制转换(发送不需要响应的消息),甚至是平行地图功能( pmap )。

<强> P.S。

比较 - 简单地使用rpc:call与从头开始实现(同样,这是一个简单的实现,它不处理一些重要的情况):

-module(myrpc).
-compile(export_all).

server() ->
        receive
                {{CallerPid, Ref}, {Module, Func, Args}} ->
                        Result = apply(Module, Func, Args),
                        CallerPid ! {Ref, Result}
        end.

call(Node, Module, Func, Args) ->
        monitor_node(Node, true),
        RemotePid = spawn(Node, ?MODULE, server, []),
        Ref = make_ref(),
        RemotePid ! {{self(), Ref}, {Module, Func, Args}},
        receive
                {Ref, Result} ->
                        monitor_node(Node, false),
                        Result;
                {nodedown, Node} ->
                        error
        end.

答案 1 :(得分:7)

rpc似乎是全面的解决方案,但它有一些与规模相关的缺点。 rpc使用单个“rex”服务器来跨越节点通信,并且可能会使其不堪重负。如果你使用rpc,你应该监控这个过程。

如果通信是主要功能,并且它是io / cpu / memory消费者的首选,我会考虑自己编写。另一方面,我们可以期待OTP团队的改进(并且预先成熟的优化是万恶之源!!!)。