我对使用gproc作为pubsub进行集群有点困惑。

我想与gproc举行客户端 session ...它在一个节点上效果很好。

但是,我需要对整个系统进行集群。

在我看来,gproc似乎有两种使用集群的方法,将其设置为全局,或使用gproc_dist似乎是gen_leader的行为。

我到目前为止正确吗?
每种方法的缺点是什么? (仍然假设我正确理解了)

最佳答案

  • 我认为全局是由gen_leader实现的。因此它们是相同的方法。
  • 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等来解决客户端 session 数据。
    如果整个客户端 session 数据很高,我认为使用gproc处理它不是一个好主意,因为它会延迟进程注册。
  • 关于erlang - Erlang集群和gproc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9568445/

    10-10 13:22