【问题标题】:Compressing messages sent between Erlang nodes压缩 Erlang 节点之间发送的消息
【发布时间】:2011-08-11 00:06:41
【问题描述】:

我正在编写一个分布式 Erlang 应用程序,其中几个节点通过带宽有限的网络连接。因此,当不同节点上的进程相互发送消息时,我希望能够最小化通过网络发送的数据包的大小。

http://www.erlang.org/doc/apps/erts/erl_ext_dist.html 了解到,Erlang 分发机制在内部使用 erlang:term_to_binary/1,2 将 Erlang 消息转换为通过网络发送的外部二进制格式。现在,term_to_binary/2 支持多个可用于减小二进制文件大小的选项 (http://www.erlang.org/doc/man/erlang.html#term_to_binary-1),包括压缩选项以及选择具有更有效浮点编码的次要版本的能力。

我希望能够告诉分发机制在每次通过网络发送消息时使用这两个选项。换句话说,我希望能够指定分发机制调用 term_to_binary 的选项列表。但是,我无法找到有关此主题的任何文档。这可以吗?

感谢您的帮助! :)

【问题讨论】:

  • 你想让压缩选项可配置吗?如果是,那么您应该使用某种包含 erlang 术语的配置文件并使用“file:consult”模块。
  • 是的,我希望这是可配置的,并且按照您的建议,将此信息存储在使用 file:consult 处理的文件中肯定会起作用。但是,我的主要问题是如何让分发机制真正接受我指定的选项以打开压缩 - 这是我无法找到任何文档的原因。
  • 如果数据被压缩,你会如何匹配你的数据?
  • 检查此链接是否为您提供任何见解:: groups.google.com/group/erlang-programming/browse_thread/thread/…
  • 感谢您的建议,但我认为我需要澄清问题。假设我们有两个进程,A 和 B,它们位于不同的节点上。 A 希望向 B 发送消息 M。为此,A 节点上的 Erlang 分发机制首先使用 term_to_binary 将 M 转换为二进制文件,然后通过网络将这个二进制文件发送到 B 的节点。然后 B 的节点使用 binary_to_term 将其转换回 Erlang 术语,并将其放入 B 的消息队列中。我想改变 term_to_binary 的调用方式,但这对 A 和 B 来说是完全透明的,所以模式匹配不受影响。

标签: erlang


【解决方案1】:

您是否在节点之间使用 rpc?还是 OTP 行为?如果是这样,请尝试在发送二进制文件之前使用 zlib 对其进行压缩

【讨论】:

    【解决方案2】:

    如果我正确理解代码,消息编码围绕the line 1565 of dist.c/dsig_send() 进行硬编码,因此您无法在不修补和重新编译模拟器的情况下更改消息编码方式。

    但是,您可以按照here 所述更改消息分发的载体。有an example of use SSL for Erlang distribution。因此,您可以创建一个压缩所有传输消息的连接(甚至可以通过调整 SSL 示例来实现)。

    标准分发模块的例子很少:

    【讨论】:

    • 好的,谢谢!这肯定回答了我的问题,您实施替代分销运营商的想法很有趣……我会调查的。再次感谢。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 2017-06-26
    • 2015-11-27
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2014-06-07
    • 2019-07-23
    相关资源
    最近更新 更多