我对使用gproc作为pubsub进行聚类感到有些困惑。
我想用gproc进行客户端会话......它适用于一个节点。
但是,我需要对整个系统进行聚类。
似乎(据我所知)gproc有两种方式处理集群,将其设置为全局,或使用gproc_dist,这似乎是gen_leader行为。
到目前为止我是对的吗? 每种方法的缺点是什么? (仍然假设我没有正确行事)
答案 0 :(得分:2)
gproc_dist_tests.erl已经提供了示例代码供您解释。
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
}]}.
我认为gproc是为解决erlang的进程寄存器限制而创建的。那个“只有原子不是元组”可以用作注册密钥,并且只能为一个注册密钥注册一个且只有一个进程。 erlang已经提供了mnesia db等来解决客户端会话数据。 如果整个客户端会话数据很高,我认为使用gproc处理它并不是一个好主意,因为它会延迟进程注册。