6

リモートノードで何らかの手順を実行したいのですが。そして、これを行うための最良の方法がどれであるかはわかりません。私はこれを行うために書くことができますrpc:call。または、ノードにメッセージを送信しRemote ! {call, some_procedure}て手順を開始receiveし、応答の待機を使用します。では、erlangではどちらの方法が良いのでしょうか?それとも、実際にはさまざまな用途に使用されますか?

4

2 に答える 2

12

モジュールを使用することを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.
于 2012-09-20T08:26:24.637 に答える
7

rpcは包括的なソリューションのようですが、スケールに関連するいくつかの欠点があります。rpcは、単一の「rex」サーバーを使用してノード間通信を行い、場合によっては圧倒される可能性があります。rpcを使用する場合は、このプロセスを監視する必要があります。

通信が主な機能であり、それがio / CPU / memoryコンシューマーの最上位である場合は、自分で作成することを検討します。一方、OTPチームからの改善を期待するかもしれません(そして時期尚早の最適化はすべての悪の根源です!!!)。

于 2012-09-20T20:25:24.203 に答える