Erlang集群和gproc

时间:2012-03-05 14:37:53

标签: erlang cluster-computing publish-subscribe

我对使用gproc作为pubsub进行聚类感到有些困惑。

我想用gproc进行客户端会话......它适用于一个节点。

但是,我需要对整个系统进行聚类。

似乎(据我所知)gproc有两种方式处理集群,将其设置为全局,或使用gproc_dist,这似乎是gen_leader行为。

到目前为止我是对的吗? 每种方法的缺点是什么? (仍然假设我没有正确行事)

1 个答案:

答案 0 :(得分: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处理它并不是一个好主意,因为它会延迟进程注册。