私は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を変更したり、ある種のアドホックソリューションを書いたりすることに固執していますか?