【问题标题】:What are down sides of using ZeroMQ for sending large messages (up to gigabytes)?使用 ZeroMQ 发送大消息(高达千兆字节)有什么缺点?
【发布时间】:2018-03-23 14:39:46
【问题描述】:

我发现人们不建议使用 ZeroMQ 发送大消息。但是拆分数据对我来说真的很头疼(有点扭曲)。为什么不建议这样做是有什么具体原因?能克服吗?

【问题讨论】:

  • 很明显。为什么要发送千兆字节消息?
  • 数据包含分子和分子之间的键——它就像是特定时刻的物质实例。我们可以将它拆分为多个块,但在一切都在客户端手中之前它是没有用的,这会使服务器和客户端代码变得复杂——它需要手动组装——我们失去了消息传递框架的好处。
  • 您可能应该将该数据存储在某处,而不是传递带有指向它的哈希的消息(内容可寻址存储)。这是@user3666197 提到的。

标签: zeromq messaging


【解决方案1】:

为什么不推荐这样做?

资源...

即使是最好的零拷贝实施也必须有备用资源来将有效负载存储在几个主要独立的独立位置:

|<fatMessageNo1>|
|...............|__________________________________________________________ RAM
|...............|<fatMessageNo1>|
|...............|...............|__________________Context().Queue[peerNo1] RAM
|...............|...............|<fatMessageNo1>|
|...............|...............|...............|________O/S.Buffers[L3/L2] RAM

能克服吗?

当然,不要发送 Mastodon 大小 GB+ 的消息。可以使用任何类型的非 RAM 表示,并仅发送一个轻量级引用以允许远程对等方访问这样一个巨大的野兽。


通过评论添加了许多新问题:
(这在 StackOverflow 被认为是不公平的)

我更关心传输失败之类的事情:zeromq 会做什么(它会尝试自动重新传输,对我来说是否透明等)。 RAM 并不是那么重要——服务器可以拥有足够多的内存,而我们编写的服务并不打算同时拥有大量客户端。我谈论的数据是非常相关的(我们有分子/原子信息和它们之间的键)所以不可能发送一大块并使用它 - 我们需要它))–Paul25 mins ago子>

您可能已经知道 ZeroMQ 是在零之禅下工作的,而零保修也应运而生。

因此,ZeroMQ 分派的消息将或者“通过”无错误地传递,或者根本不传递。这是一个非常省心的方法,因为您的代码将仅以原子方式接收完全受保护的内容,因此任何受折磨的垃圾都不会到达您的目标后处理。更高级别的软协议握手允许一个人保持控制,从而能够从更高级别的抽象中缓解未交付的情况,因此如果您的设计要求和部署条件允许,可以利用蛮力并发送任何内容-@ 987654324@-BLOBs,如果其他人允许并且不介意,您自己承担本地和基础设施资源受阻的风险(...但从不听我的建议:o))

如果配置、资源和超时允许,则会处理错误恢复自我修复 - 来自丢失连接和类似的现实问题,因此保持 L1/L2/L3-ISO-OSI 会遇到很多麻烦层问题对用户应用程序程序员有效地隐藏。

【讨论】:

  • 我更关心传输失败之类的事情:zeromq 会做什么(它会尝试自动重新传输,对我来说是否透明等)。 RAM 并不是那么重要——服务器可以拥有足够多的内存,而我们编写的服务并不打算同时拥有大量客户端。我谈论的数据是非常相关的(我们有分子/原子信息和它们之间的键)所以不可能发送一大块并使用它 - 我们需要它))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多