用于gen_server套接字广播的OTP模式是什么?

时间:2014-07-26 18:26:10

标签: erlang otp

所以我有一个非阻塞OTP套接字服务器非常类似于Learn Yorself Some Erlang中的那个:

http://learnyousomeerlang.com/buckets-of-sockets

主管将侦听套接字传递给动态生成的gen_servers,每个gen_servers都可以接受单个连接;通过这种方式,监听套接字不会被(阻塞)对gen_tcp:accept的调用阻塞,并且由主管生成的每个gen_server实际上代表一个客户端。

现在这一切都非常好,我可以通过telnet与服务器通信,这是一个回应我的请求的简单回声处理程序。

但是如果我想将它扩展到一个简单的聊天服务器呢?这里缺少的显而易见的事情是能够向所有连接的客户端发送广播消息。但是目前gen_server客户端都没有知道其他任何客户的存在!

一个gen_server能够为所有其他人提供pid的合理的OTP兼容模式是什么?我能想到的唯一方法就是将某些包含pids / usernames的mnesia / ets表作为gen_server状态变量的一部分,但不知何故,这似乎不像OTP那样。

想法?

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用ETS表存储Pids将是最佳选择。我会使用监督过程作为表管理器,并在添加到ETS表的Pids上设置监视器,这样您就可以检测进程何时死亡并可以从ETS表中删除它。

为了在使用ETS时的容错能力,您需要采取一些预防措施,请参阅Don't Loose your ets Tables以获取有关如何执行此操作的详细介绍。

但是对于一个真实的系统,我会使用pg2gproc模块来做这种事情。 pg2包含在OTP中,更适用于分布式系统,gproc更灵活。两者都使用ETS表来存储数据。