3
我對gproc作爲pubsub進行集羣有點困惑。Erlang集羣和gproc
我想用gproc舉行客戶端會話......它對一個節點很好用。
但是,我需要對整個系統進行聚類。
看來(據我所知),gproc有兩種方式與羣集一起工作,將其設置爲全局,或使用似乎是gen_leader行爲的gproc_dist。
我到目前爲止是否正確? 每種方法的缺點是什麼? (仍然假設我承諾正確)
我對gproc作爲pubsub進行集羣有點困惑。Erlang集羣和gproc
我想用gproc舉行客戶端會話......它對一個節點很好用。
但是,我需要對整個系統進行聚類。
看來(據我所知),gproc有兩種方式與羣集一起工作,將其設置爲全局,或使用似乎是gen_leader行爲的gproc_dist。
我到目前爲止是否正確? 每種方法的缺點是什麼? (仍然假設我承諾正確)
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來處理它並不是個好主意,因爲它會延遲進程註冊。
其實我在談論連接的客戶端會話,每個客戶端都是gen_server,他們的進程存儲在Gproc中,所以我真的需要Gproc的面向過程的範例。不確定我可以在Mnesia上存儲pid ... – TheSquad 2012-03-06 02:34:02
並且感謝您的明確回答! – TheSquad 2012-03-06 02:36:02