リモートノードで何らかの手順を実行したいのですが。そして、これを行うための最良の方法がどれであるかはわかりません。私はこれを行うために書くことができますrpc:call
。または、ノードにメッセージを送信しRemote ! {call, some_procedure}
て手順を開始receive
し、応答の待機を使用します。では、erlangではどちらの方法が良いのでしょうか?それとも、実際にはさまざまな用途に使用されますか?
2 に答える
モジュールを使用することをrpc
お勧めします。そうでない場合は、リモートノードの監視を管理し、呼び出しの一意のIDを提供し、タイムアウトを処理する必要があります。また、応答を送り返すためのラッパーを提供する必要があります。機能の結果。
ただし、これらの操作はすべて汎用rpc
であり、モジュールに実装されています。
ちなみに、リモート呼び出しにはさまざまなバリエーションがあり、同期呼び出しと非同期呼び出し、キャスト(応答を必要としないメッセージの送信)、さらには並列マップ関数(pmaprpc
)で実装されています。
PS
比較-単に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.
rpcは包括的なソリューションのようですが、スケールに関連するいくつかの欠点があります。rpcは、単一の「rex」サーバーを使用してノード間通信を行い、場合によっては圧倒される可能性があります。rpcを使用する場合は、このプロセスを監視する必要があります。
通信が主な機能であり、それがio / CPU / memoryコンシューマーの最上位である場合は、自分で作成することを検討します。一方、OTPチームからの改善を期待するかもしれません(そして時期尚早の最適化はすべての悪の根源です!!!)。