我希望有2个独立的erlang节点可以相互通信:
所以节点a@myhost将能够发送消息b@myhost.
是否有限制节点的任何方式a@myhost,所以只能从一个功能secure_module可以叫上b@myhost?
它应该是这样的:
a@myhost> rpc:call(b@myhost,secure_module,do,[A,B,C]) returns {ok,Result}
Run Code Online (Sandbox Code Playgroud)
和所有其他电话
a@myhost> rpc:call(b@myhost,Modue,Func,Args) return {error, Reason}
Run Code Online (Sandbox Code Playgroud)
其中一个选择是使用ZeroMQ库来建立节点之间的通信,但是如果可以使用一些标准的Erlang函数/模块来完成它会更好吗?
在这种情况下,分布式Erlang不是你想要的.将节点A连接到节点B构成一个集群 - 一个巨大的可信计算环境.您不想信任其中的一部分,因此您不需要单个群集.
而是编写特定的网络服务.使用网络本身作为抽象层.最直接的方法是建立从A到B 的流连接(只是无聊gen_tcp,gen_sctp或者使用ssl或其他).
A上的套接字处理过程接收来自节点A的任何部分需要调用B的消息 - 您完全按照它们直接连接时的方式写入.使用正常的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_termtranslation 通过完全相同的过程返回到另一个方向.
您的服务流程应该接收定义明确的消息,并忽略任何无意义的消息(通常只记录废话).因此,通过这种方式,您不会执行直接RPC(在不受信任的环境中不安全),您只响应在您的(微小的)消息传递协议中定义的有效语义.编写套接字处理进程的方式是可以为您提取这些内容并使其感觉就像您在分布式Erlang中处理受信任环境一样,但实际上您有两个独立的集群,它们对每个集群的请求都有限制另外你的协议的定义.