环境:
我想在 erlang 集群中启动一个唯一的全局注册 gen_server 进程。如果进程停止或运行它的节点出现故障,则该进程将在其他节点之一上启动。
该过程是主管的一部分。问题是在第二个节点上启动主管失败,因为 gen_server 已经在运行并从第一个节点全局注册。
问题):
-
是否可以检查进程是否已经在 gen_server 的 start_link 函数中全局注册,在这种情况下返回
{ok, Pid}
已经运行的进程而不是启动新的 gen_server 实例? - 是否正确,这样一个进程将成为多个主管的一部分,如果一个进程出现故障,所有其他节点上的所有主管都会尝试重新启动该进程。第一个主管将创建一个新的 gen_server 进程,其他主管将再次链接到该进程。
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).