設定:
erlang クラスターで一意のグローバル登録 gen_server プロセスを開始したいと考えています。プロセスが停止した場合、またはプロセスを実行しているノードがダウンした場合、プロセスは他のノードのいずれかで開始されます。
プロセスはスーパーバイザーの一部です。問題は、gen_server がすでに実行されており、最初のノードからグローバルに登録されているため、2 番目のノードでスーパーバイザーを起動できないことです。
質問:
-
プロセスが gen_server の start_link 関数内で既にグローバルに登録されているかどうかを確認しても問題ありませんか? この場合
{ok, Pid}
、新しい gen_server インスタンスを起動する代わりに、既に実行中のプロセスを返しますか? - このようにして、1 つのプロセスが複数のスーパーバイザーの一部になり、1 つのプロセスがダウンした場合、他のすべてのノードのすべてのスーパーバイザーがプロセスを再起動しようとするのは正しいですか。最初のスーパーバイザーは新しい gen_server プロセスを作成し、他のスーパーバイザーはすべてその 1 つのプロセスに再度リンクします。
global:trans()
gen_server の start_link 関数内である種のものを使用する必要がありますか?
コード例:
start_link() ->
global:trans({?MODULE, ?MODULE}, fun() ->
case gen_server:start_link({global, ?MODULE}, ?MODULE, [], []) of
{ok, Pid} ->
{ok, Pid};
{error, {already_started, Pid}} ->
link(Pid),
{ok, Pid};
Else -> Else
end
end).