小编Rum*_*ilz的帖子

Erlang:erlang集群中单例gen_server的最佳方式?

设置:

我想在erlang集群中启动一个唯一的全局注册gen_server进程.如果进程停止或运行它的节点发生故障,则将在其他节点之一上启动该进程.

该过程是主管的一部分.问题是在第二个节点上启动管理程序失败,因为gen_server已在运行并从第一个节点全局注册.

问题(S):

  • 是否可以检查进程是否已在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).


erlang global gen-server

6
推荐指数
2
解决办法
2949
查看次数

标签 统计

erlang ×1

gen-server ×1

global ×1