1

私はErlangアプリケーションを持っていますが、リソースを少し消費しすぎて1つのノードにとどまることができません。私はgen_serversをあるプロセスから別のプロセスに移動させる過程にあります-これは比較的簡単であることがわかりました。私は最後のハードルにいます。これらのgen_serverを作成するファクトリプロセスを取得して、ローカルノードではなくリモートノードでそれらを生成します。start_linkのデフォルトの動作は明らかにローカルでのみ開始することですが、それを変更するオプションはありません。

私はそのソリューションを独創的にする必要があるように思われ、そこにいる誰かがすでにこのようなものを実装して成功したかどうかを確認したいと思いました。IOW、推奨される解決策は何ですか?

編集

私は呼び出しによってトリガーされる呼び出しのチェーンを見ています:

gen_server:start_link(?Module, Args, [])

gen_server:start_link / 3:

start_link(Mod, Args, Options) ->
    gen:start(?MODULE, link, Mod, Args, Options).

gen:start / 5:

start(GenMod, LinkP, Mod, Args, Options) ->
    do_spawn(GenMod, LinkP, Mod, Args, Options).

gen:do_spawn / 5:

do_spawn(GenMod, link, Mod, Args, Options) ->
    Time = timeout(Options),
    proc_lib:start_link(?MODULE, init_it,
                        [GenMod, self(), self(), Mod, Args, Options], 
                        Time,
                        spawn_opts(Options));

proc_lib:start_link / 5:

start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) ->
    Pid = ?MODULE:spawn_opt(M, F, A, ensure_link(SpawnOpts)),
    sync_wait(Pid, Timeout).

これでようやく興味深い部分にたどり着きました。以下に一致するspawn_opt/4があります。

spawn_opt(M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) ->
    ...
    ...

しかし、実際に私に役立つものがあります:

spawn_opt(Node, M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) ->
    ...
    ...

これが公開されていないのは気が遠くなるほどで​​す。不注意なプログラマーが火星で実行されているerlangノード上のプロセスをgen_server:start_linkしようとして、30分間呼び出しをブロックするリスクがあることを認識していますが、確かにそれはプログラマーの見張りです。私は本当にOTPを変更したり、ある種のアドホックソリューションを書いたりすることに固執していますか?

4

2 に答える 2

6

start_linkリモートノードに直接サーバーを配置することはありません。優れたプログラム構造と単純さのために、リモートノードで別のアプリケーションを起動し、リモートプロセスの作成をリモートアプリケーションで実行されている特定のプロセスに委任します。

プロセスへのリンクは主に監視または監視を目的としているため、リモートプロセスではなく、ローカルスーパーバイザーとのリンクを行うことをお勧めします。リモートプロセスの生存ステータスが必要な場合は、とをお勧めerlang:monitorerlang:demonitorます。

典型的な分散セットアップ:

Node1
+---------------+                          Node2
| App1          |                          +---------------+
|   Supervisor1 |  Proc Creation Request   | App2          |
|     Processes | -----------------------> |   Supervisor2 |
|     ......    |                          |      |
|     ......    |                          |      | Create Children
|     ......    |       Monitor            |      V
|     ......    | -----------------------> |     Processes |
+---------------+                          |     ......    |
                                           +---------------+
于 2012-09-13T07:37:25.940 に答える
1

多分rpcモジュールはあなたを助けます。特に関数async_call

于 2012-09-13T01:00:12.833 に答える