我想在远程节点上执行一些过程。我不确定哪个是最好的方法来做到这一点。我可以写一个rpc:call
来做到这一点。或者通过Remote ! {call, some_procedure}
向节点发送消息来启动该程序并使用receive
等待响应。那么erlang哪种方式更好?或者他们实际上是为了不同的用法?Erlang:远程调用vs发送消息
4
A
回答
9
最好使用模块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.
+0
认为在某些系统中,节点监控已经存在,因此编写自己的应用感知型通信模型并不是那么痛苦。 – user425720
5
RPC似乎是全面的解决方案,但它有一些与规模有关的缺点。 rpc使用单个'rex'服务器来跨节点通信,并且可能会被淹没。如果你使用rpc,你应该监控这个过程。
如果通信是主要功能,并且它是io/cpu /内存消费者的顶部,我会考虑自己编写它。另一方面,我们可能期望OTP团队的改进(并且预先优化是万恶之源!!!)。
相关问题
- 1. Erlang进程发送消息
- 2. 发送消息Pid Erlang
- 3. 将消息发送到erlang的远程节点端口
- 4. 使用Erlang从ejabberd发送消息
- 5. 发送日志消息到远程API
- 6. MSMQ发送消息到远程队列
- 7. erlang分布式消息发送
- 8. Erlang:发送消息给模块?
- 9. 在erlang进程中发送消息:原子vs二进制文件
- 10. 在erlang消息上可以发送什么类型的消息?
- 11. 如何发送消息到Erlang的进程组
- 12. 是否可以向Erlang的未注册流程发送消息?
- 13. NServiceBus消息在远程发送时消失
- 14. SSIS发送MSMQ消息到远程服务器专用队列
- 15. 更正用于发送远程JMS消息的ConnectionFactory jboss 7.1.1
- 16. 用RabbitMQ发送消息到远程服务器
- 17. 如何在Erlang中发送多播消息并重用端口?
- 18. Java发送消息线程
- 19. Android程序发送消息
- 20. SQS消息发送时调用Lambda
- 21. Oracle调用URL发送文本消息
- 22. 自动发送消息给调用者
- 23. 发送消息
- 24. 发送消息
- 25. 发送消息
- 26. 通过linux远程发送调用库
- 27. 通过应用程序发送消息
- 28. 从iPhone应用程序发送消息
- 29. 发送android应用程序的消息?
- 30. 调试Nservicebus消息发送问题 - 消除消息
看看我编辑的代码示例的答案。 – stemm
@stemm这真的是一个详细的答案。我只是等待看看是否还有其他观点。 – halfelf