【发布时间】: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