消息传递到另一个节点上的特定进程 - Erlang

时间:2014-12-23 21:34:54

标签: multithreading erlang distributed distributed-computing

我的问题如下

假设我在不同的计算机上有两个Erlang节点A和B,它们以相同的cookie值启动,并且它们都运行我的同一服务器应用程序

让我们说有两个用户,user1和user2

user1已连接到A,user2已连接到B

当用户(任何用户)连接到Erlang节点(由负载均衡器选择的任何节点)时,循环函数tcp_accept()为他生成一个单独的线程并递归继续,但是生成的PID从未注册,也不会在本地注册也不是全球的而是我将节点名称和PID(该节点的本地)保存为标识进程的元组,在某些DB中

一小时前我认为节点名称和PID(该节点名称的本地)是两个足够的凭据,它允许我们从任何其他分布式节点(以相同的cookie启动)向该线程发送消息

现在我已经完成了这部分任务,我无法弄清楚如何做到这一点

实际上是否可以向特定节点上运行的进程发送消息,只知道节点名称和线程PID(该节点的本地节点)?

PS。我不想注册PID,因为系统的目的是同时接受来自许多用户的连接,而Erlang教程不鼓励注册每个用户进程,因为注册名称是非垃圾收集的原子,因此可能导致内存泄漏。相反,它建议在一些存储中存储<username, PID>

1 个答案:

答案 0 :(得分:1)

服务器应该跟踪任何连接的用户(&#34;用户进程&#34;,节点,昵称......)的pid。他们也应该互相认识。当用户A想要连接到另一个用户B时,他将使用其昵称来执行此操作,该请求将被发送到本地服务器,后者又在本地和远程服务器上查找此昵称。如果搜索成功,则能够将用户B的连接信息发送回用户A进程。那么&#34;直接&#34;沟通可以开始。

这种模式看起来不太好,因为进程可能崩溃,特别是用户进程(断开连接,错误输入,超时......)。我认为通常的方法是使用逻辑地址(例如昵称)向服务器发送消息,服务器负责调度,存储,检索...消息