我对使用gproc作为pubsub进行集群有点困惑。
我想与gproc举行客户端 session ...它在一个节点上效果很好。
但是,我需要对整个系统进行集群。
在我看来,gproc似乎有两种使用集群的方法,将其设置为全局,或使用gproc_dist似乎是gen_leader的行为。
我到目前为止正确吗?
每种方法的缺点是什么? (仍然假设我正确理解了)
最佳答案
dist_test_() ->
{timeout, 120,
[{setup,
fun() ->
Ns = start_slaves([dist_test_n1, dist_test_n2]),
?assertMatch({[ok,ok],[]},
rpc:multicall(Ns, application, set_env,
[gproc, gproc_dist, Ns])),
?assertMatch({[ok,ok],[]},
rpc:multicall(Ns, application, start, [gproc])),
Ns
end,
fun(Ns) ->
[rpc:call(N, init, stop, []) || N <- Ns]
end,
fun(Ns) ->
{inorder,
[
{inparallel, [
fun() ->
?debugVal(t_simple_reg(Ns))
end,
fun() ->
?debugVal(t_simple_counter(Ns))
end,
fun() ->
?debugVal(t_aggr_counter(Ns))
end,
fun() ->
?debugVal(t_update_counters(Ns))
end,
fun() ->
?debugVal(t_shared_counter(Ns))
end,
fun() ->
?debugVal(t_mreg(Ns))
end,
fun() ->
?debugVal(t_await_reg(Ns))
end,
fun() ->
?debugVal(t_await_self(Ns))
end,
fun() ->
?debugVal(t_await_reg_exists(Ns))
end,
fun() ->
?debugVal(t_give_away(Ns))
end,
fun() ->
?debugVal(t_sync(Ns))
end,
fun() ->
?debugVal(t_monitor(Ns))
end,
fun() ->
?debugVal(t_subscribe(Ns))
end
]
},
fun() ->
?debugVal(t_sync_cand_dies(Ns))
end,
{timeout, 90, [fun() ->
?debugVal(t_fail_node(Ns))
end]}
]}
end
}]}.
erlang已经提供了mnesia db等来解决客户端 session 数据。
如果整个客户端 session 数据很高,我认为使用gproc处理它不是一个好主意,因为它会延迟进程注册。
关于erlang - Erlang集群和gproc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9568445/