2012-03-05 89 views
3

我對gproc作爲pubsub進行集羣有點困惑。Erlang集羣和gproc

我想用gproc舉行客戶端會話......它對一個節點很好用。

但是,我需要對整個系統進行聚類。

看來(據我所知),gproc有兩種方式與羣集一起工作,將其設置爲全局,或使用似乎是gen_leader行爲的gproc_dist。

我到目前爲止是否正確? 每種方法的缺點是什麼? (仍然假設我承諾正確)

回答

2
  1. 我認爲全球是由gen_leader實施。所以他們是相同的方法。
  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 
        }]}. 
    
  3. 我認爲gproc是爲解決erlang的進程寄存器限制而創建的。這是「只有原子而不是元組」,可以用作註冊鍵,並且一個註冊鍵可以註冊一個且只有一個進程。 erlang已經提供了mnesia db等來解決客戶端會話數據。 如果客戶端會話數據很高,我認爲使用gproc來處理它並不是個好主意,因爲它會延遲進程註冊。

+0

其實我在談論連接的客戶端會話,每個客戶端都是gen_server,他們的進程存儲在Gproc中,所以我真的需要Gproc的面向過程的範例。不確定我可以在Mnesia上存儲pid ... – TheSquad 2012-03-06 02:34:02

+0

並且感謝您的明確回答! – TheSquad 2012-03-06 02:36:02