我想要有 2 个独立的 erlang 节点可以相互通信:
so node a@myhost
将能够发送消息至b@myhost
.
有没有办法限制节点a@myhost
,所以只有来自 a 的函数安全模块可以被召唤b@myhost
?
它应该是这样的:
a@myhost> rpc:call(b@myhost,secure_module,do,[A,B,C]) returns {ok,Result}
和所有其他电话
a@myhost> rpc:call(b@myhost,Modue,Func,Args) return {error, Reason}
其中一种选择是使用ZeroMQ
库来建立节点之间的通信,但是如果可以使用一些标准的 Erlang 函数/模块来完成会更好吗?
在这种情况下,分布式 Erlang 并不是您想要的。将节点 A 连接到节点 B 形成一个集群——一个巨大的、可信的计算环境。您不想信任其中的一部分,因此您不需要单个集群。
而是编写一个特定的网络服务。使用网络本身作为抽象层。最直接的方法是建立一个流连接(只是无聊的老gen_tcp
, or gen_sctp
或使用 ssl 或其他)从 A 到 B。
A 上的套接字处理进程从节点 A 需要调用 B 的任何部分接收消息——你可以这样写exactly就像它们直接连接一样。使用普通的 Erlang 消息传递风格:Message = {name_of_request, Data}
或类似的。 A 上的连接过程很简单gen_tcp:send(Socket, term_to_binary(Message))
.
B 穿梭机上的套接字处理进程通过简单地接收套接字和服务进程之间的网络消息{tcp, Socket, Bin} -> Servicer ! binary_to_term(Bin)
.
计算结果通过完全相同的过程返回另一个方向term_to_binary
/binary_to_term
再次翻译。
您的服务流程应该接收明确定义消息,并忽略任何没有意义的内容(通常只是记录无意义的内容)。因此,通过这种方式,您不会执行直接 RPC(这在不受信任的环境中是不安全的),您只是响应有效语义在您的(小)消息传递协议中定义。套接字处理过程的编写方式可以为您抽象出来,让您感觉好像您正在处理分布式 Erlang 中的可信环境,但实际上您有两个独立的集群,它们可以向每个集群请求的内容受到限制。其他由您的协议定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)