【问题标题】:Can reply be optional in ZeroMQ?ZeroMQ 中的回复可以是可选的吗?
【发布时间】:2023-04-05 11:17:01
【问题描述】:

我正在 ZeroMQ 中实现Lamport's distributed MUTEX algorithm。

算法:

请求过程

1 ) 将其请求推送到自己的队列中(按时间戳排序)
2 ) 向每个节点发送请求。
3 ) 等待所有其他节点的回复。
4 ) 如果自己的请求在其队列的头部并且已经收到所有回复,则进入临界区。
5 ) 退出临界区后,将其请求从队列中移除,并向每个进程发送释放消息。

其他进程

1 ) 收到请求后,将请求推送到自己的请求队列中(按时间戳排序),并以时间戳进行回复。
2 ) 收到release消息后,将对应的请求从自己的请求队列中移除。

我正在考虑用 C 或 Java 编写解决方案,但问题的核心似乎与语言无关。

在我的问题中,我有三种消息类型,我们称它们为Request、Reply 和Release。 Request/Reply 消息非常适合 REQ/REP 模式,但 Release 消息是单向信号,不需要回复。我可以添加一个额外的 PUB/SUB 对,但是,据我了解,我将无法保证系统中的 FIFO 交付顺序,因为我最终会拥有两个并发 TCP 连接(这个假设是否正确?)。

我可以使用基本的无约束全双工通道。另一个 answer 建议使用 DEALER/ROUTER 对,但对于这样一个简单的问题来说,这似乎有点过头了。在文档中,DEALER/ROUTER在Advanced Request-Reply Patterns一章中有所描述,我的问题似乎不需要极端的解决方案。

如何解决我的问题?

【问题讨论】:

  • 请随意填写以建议更好的标题。
  • 您已经成为会员很长时间了,并且已经提出了足够多的问题并回答了足够多的答案,因此您知道最好不要发布如此广泛的问题。对于初学者,Java 或 C?选择一个。
  • @Someprogrammerdude Java/C 问题还不是最糟糕的部分——ZeroMQ 具有原生 C 接口和良好的 [Java] 端口。我可以接受任何这些语言中具有潜在 sn-ps 的解决方案。我也对问题的广泛性表示(有点)不好,但我不知道如何在不产生 XY 问题的情况下缩小范围。我已经分享了上下文,我已经提供了我之前尝试过的内容,我已经链接了一个相关问题。我认为这个问题是可以接受的,但我愿意接受建议。
  • @user3666197 感谢您复制和粘贴算法描述,但我希望我形成了我面临的问题的本质。该链接仅供好奇者使用。现在,这是一个作为家庭作业问题被关闭的边缘。

标签: java c network-programming zeromq distributed-computing


【解决方案1】:

“回复在 ZeroMQ 中可以是可选的吗?”

短版:可以。

只要设置正确.setsockopt( zmq.REQ_RELAXED, 1 )


加长版:

如果分布式系统确实应该获得健壮性,那么对于已定义的问题还有更多的问题需要解决。 REQ/REP 不必陷入基本上无法挽救的相互死锁,因为分布式 FSA 是 .REQ_RELAXED 设置的捷径,但 ZeroMQ 不为消息传递提供保证。这是尽力而为的传递,因此如果需要保证消息传递,您需要实现更高级别的协议握手。 设置 .setsockopt( zmq.REQ_CORRELATE, 1 ) 可能会有所帮助。

【讨论】:

  • 不能依赖TCP层重传吗?
  • 忘掉底层细节,所有可用的 ZeroMQ 传输类引擎(不仅是 tcp:// ...)都很好地处理了这些细节 - Zen-of-Zero 原则只是简单地与足够的功能并使服务足够智能以实现低延迟和高性能。需求高于这些零之零的用户还可以添加额外的剩余开销,因为鲁棒交付、分布式共识和许多其他需要,所以轮到你根据需要添加临时层了。 这既聪明又公平,不是吗?
  • 引用文档:“当设置为 1 时,允许发送另一条消息,并具有断开与预期回复的对等方的底层连接的效果,触发支持的传输重新连接尝试它。”。似乎不是一个轻量级的一流解决方案。 :(
  • Native API 4.2+ 没有声明类似的内容,抱歉。
  • 你是对的,它在 4.0 和 4.2 之间发生了变化。很有趣。
猜你喜欢
  • 2014-06-30
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2015-11-09
  • 2020-04-28
  • 2018-01-22
  • 2013-05-29
  • 1970-01-01
相关资源
最近更新 更多