2

我正在使用 ZeroMQ 指南图 41定义的标准 LRU 队列,我想知道如何添加保护,这样我就不会将消息发送到已经消失的端点(服务器崩溃、OOM 杀手、任何类似的东西)。

从我读到的文档中,如果 XREP 将发送到一个不存在的端点,它只会丢弃该消息,并且我无法收到有关该消息的通知。有没有办法得到这样的通知?我应该先发出一个“ping”,如果我没有得到回应,那么那个“工人”对我来说就是死肉吗?我如何知道我刚刚向其发送 ping 并从中获取消息的客户端是同一个客户端?

或者我的用例对 ZeroMQ 来说不是一个好用例?我只是想确保收到了一条消息,我不希望它在我不知情的情况下掉在地板上......

4

1 回答 1

3

ping 一个 worker 以知道它是否还活着会导致竞争条件:worker 很可能会在它死之前回答这个 ping。

但是,如果您假设工作人员在请求处理期间不会死亡(在这种情况下您可以做的很少),您可以反转工作人员和中央队列之间的通信流。让工作人员从队列中获取请求(使用REQ/REP连接),并在处理完成时将答案与原始信封一起发送(使用与上面相同的套接字,或者甚至更好地通过单独的PUSH/PULL连接)。

在这种情况下,您知道不会向死掉的工作人员发送请求,因为它将无法获取它们(正在死去......)。此外,您的中央队列甚至可以确保它在给定时间内收到对每个请求的答复。如果没有,它可以将请求放回队列中,以便新的工作人员在不久之后获取它。这样,即使工作人员在处理请求时死亡,最终也会处理该请求。

(附带说明:如果工作人员因特定请求而崩溃,请小心——您不想一个一个地杀死您的工作人员,并且可能希望对请求进行最大尝试次数)

编辑:我写了一些代码来实现另一个方向来解释我的意思。

于 2010-12-07T20:52:37.430 回答