带队列的 ZeroMQ 无代理网络 (Java)

ZeroMQ brokerless network with queues (Java)

是否可以使用 ZeroMQ(使用 JeroMQ Java 移植)实现带队列的无代理网络?

在我的网络中,所有对等点都是发布者和接收者(SUB/PUB 模式),因此当一个对等点发送消息时,所有其他对等点都会收到消息。

问题是消息不可靠并且可能会丢失(例如由于连接问题)并且无法再恢复。

我想实现一个队列,让对等方可以检索他们尚未收到的消息。

我正在查看 this 指南(即使它是针对 Python 的),看来我应该实施 XREP/XREQ 模式:

但似乎只有实现队列服务器才有可能。是真的吗?

问:这是否可能只实现一个队列服务器?
答:不。

可能是我没有完全理解您的观点,但是在基于 ZeroMQ 的内部工作了几年 ,我可以解决概念中的一些遗漏。

第一个:
是的,Zen-of-Zero 确实为相应的消息传递提供了 ZERO-Warranty。这似乎令人惊讶,但以这种方式工作有很多原因,没有其他原因。有一致性保证——即一条消息要么被传递 as-is 要么被传递 none。这意味着,如果消息已经通过套接字,接收方可以确定,发送方正在发送这个内容并且不需要 error-checking 到位,因为 ZeroMQ 已经花费了所有的努力交付原件的 1:1 bit-by-bit 副本。

下一个:
ZeroMQ 被设计为 Broker-less 异步轻量级信号/消息传递工具。 Broker-less 这个词的意思是,有 zero-efforts 花费任何类型的 tool-based 持久性,所以确实不关心任何 Broker-side存储消息的任何(半)持久副本,无论是已交付的还是由于任何技术原因未交付的副本(但是,已交付的副本——如上所述——保证是正确的,并且是原来 ).

含义:
这意味着,设计 zmq.device( zmq.Queue, f, b ) 的效果将为零,因为它将具有上面报告的所有属性,因此它将主要生活在同一组范例下。


解决方案?

如果需要同时拥有 content-warranty 和 all-messages-delivered 保证,前者自 ZeroMQ 工具一开始就包含在其中,后者将添加到标准之上工具,作为 supra-pattern、re-using delivery-agnostic 标准工具的扩展。

这样就可以得到上面勾勒的内容,但不会在所有其他 use-cases 中浪费一个 CPU-clock,其中 delivery-agnostic,只有 "best-effort" 传输是好的