在http连接的erlang集群之间共享原子

时间:2015-01-07 10:55:15

标签: erlang

我们的基础架构中有一些非erlang连接的集群,目前使用term_to_binary来编码集群之间的消息的erlang术语。在接收方,我们使用binary_to_term(Bin,[safe])仅转换为现有原子(如果消息中有任何原子)。

偶尔(特别是在启动一个新的簇/堆栈之后),我们遇到的问题是在消息中编码了部分已知的原子,即发送簇知道这个原子,但接收不知道。这可能是出于各种原因,最常见的是接收节点只是没有加载包含某些记录定义的模块。我们目前使用了一些讨厌的解决方法,基本上相当于维护一个可能使用的原子的简短列表,但我们对这种容易出错的方法并不满意。

有没有一种智能的方法在这些集群之间共享原子?或者是否建议不要将二进制格式用于此类目的?

期待您的见解。

1 个答案:

答案 0 :(得分:1)

我会想到为什么非Erlang节点首先发送原子值。最有可能对用于通信的协议进行一些调整 - 或者大多数情况下根本没有定义真正的协议,并且使用中的实际协议随着时间的推移有机地发展。

不知道有关情况的任何细节,有两种解决方法:

  • 深入使用抽象的序列化技术,如ASN.1或JSON或其他,使用二进制字符串而不是原子。当你有一组很好理解的结构化数据要发送时(这可能包装非结构化或不透明的数据),这是最有意义的。
  • 保持浅薄,然后为您将首先发送/调用的进程/模块编写一个功能API接口,以确保您完全理解您的协议实际是什么,然后通过使每个接口调用对应于匹配的网络消息,当收到该消息时,将调度API函数调用所具有的相同过程。

基本问题是非Erlang节点能够生成集群可能不知道的原子的想法。这是一个有点棘手的问题。在许多情况下,您使用原子的位置可以使用二进制来实现类似的效果并保留相同的语义而不会混淆运行时。它是{<<"new_message">>, Data}{new_message, Data}之间的差异;函数头内的匹配以相同的方式工作,在语法上稍微有些嘈杂。