我是Erlang的新手,我们正在开发一个小型消息服务器。
我们正在尝试使用Redis构建流程注册表(不计划使用现有的一次grpoc,由于其他业务需求而使用全局等)作为数据存储(将用户ID保存到“node | PID”映射的存储)。当进程启动时,它以user_id(key)和{node |的形式向Redis注册自己pid}作为价值。 (pid在redis中以字符串形式出现)
在redis中插入的示例值是“user_abc”,{one @ mf,“0.37.0>”}
现在,当我尝试为群集中运行的“user_abc”找到PID时,我将{node和pid}作为远程节点上的值,在这种情况下是{one @ mf,“0.37.0>”
问题是我们如何使用远程节点上的{node,pid}详细信息连接到进程user_abc。
提前感谢您的帮助。
答案 0 :(得分:2)
您可以获得"群集范围" pid通过解析远程节点上的pid:
在节点a
上:
(a@host)1> pid_to_list(self()).
"<0.39.0>"
在节点b
上:
(b@host)1> Pid = rpc:call('a@host', erlang, list_to_pid, ["<0.39.0>"]).
<7101.99.0>
(b@host)2> Pid ! my_test.
my_test
在节点a
上:
(a@host)2> flush().
Shell got my_test
ok
请注意,该过程可能尚未生效,因此在与之交谈之前调用erlang:monitor/2
可能是一个好主意。
答案 1 :(得分:0)
如果您想将erlang pid存储到redis,并希望其他节点将其作为远程pid读取,请使用 erlang:term_to_binary(Pid)
进行存储,然后使用 erlang:bianry_to_pid(PidBin)
阅读。
请参阅此帖子:Erlang Pid