我正在尝试在 erlang 中开发一个聊天服务器,并且我想在一组进程之间广播消息,我提出了三种选择
- 将每条消息发送到主进程,主进程将消息发送给组的其他成员,这对我来说似乎是一个瓶颈!
- 使用包含组的所有 pid 的全局 ets 表(过度复制)。
- 使用 upd 多播。
- pg 模块,与 1 相同。
什么是最好的方法,还有其他选择吗?
更自然的方法是让每个进程都知道它将与之通信的每个其他进程的 pid()。将 [pid()] 保持在进程状态并通过使用 link/1 使其保持最新状态,以便在进程死亡时接收 {'EXIT', Pid, Reason}。
Erlang 中的多播是向每个接收者单播。除此之外,没有其他方法可以传播信息。由于您只有少量进程,我认为您在复制时根本不会遇到任何问题。至少在它成为系统的瓶颈之前我不会太担心它。
不要低估保留一个作为组的多播器的进程。这可能是一个简单的解决方案,尽管只是将 pid() 保存在 ETS 表中或使用gproc
它可能大致相同。
一开始担心过度复制可能不会有成效。这里的一个技巧可能是将消息存储为大型二进制文件,然后将其发送出去。然后,正如 Marcelo 所写,您只会传递引用。
Vance Shipley 关于链接的解决方案是我会避免的。链接是双向的,您必须捕获出口才能获得出口消息。最好通过调用来维护终生知识erlang:monitor(process, Pid)
。您将需要这样做,因为必须从组中删除离开的进程。收到表单的消息{'DOWN', ..., ...}
将表明您需要进行清理。