可以在ZeroMQ中回复吗?

我正在ZeroMQ中实现Lamport的分布式MUTEX算法 。

算法:

请求流程

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

其他流程

1)收到请求后,将请求推送到自己的请求队列中(按时间戳排序)并回复时间戳。
2)收到释放消息后,从自己的请求队列中删除相应的请求。

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

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

我可以使用一个基本的非约束fullduplex通道。 另一个答案建议使用DEALER / ROUTER对,但对于这样一个简单的问题来说似乎有些过分。 在文档中,在高级请求 – 回复模式章节中描述了DEALER / ROUTER,我的问题似乎不需要极端的解决方案。

我的问题怎么解决?

在ZeroMQ中可以回复吗?

简短版:可以。

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


更长的版本:

如果确实分布式系统应该获得稳健性,那么定义问题还有更多问题需要解决。 REQ/REP不需要陷入原本无法解决的相互死锁,因为分布式FSA是.REQ_RELAXED设置的快捷方式,但ZeroMQ不提供邮件传递的保证。 这是一种尽力交付,因此如果需要有保证的消息传递,您需要实施更高级别的协议握手。 设置.setsockopt( zmq.REQ_CORRELATE, 1 )可能会有所帮助。