我正在使用ZeroMQ指南figure 41定义的标准LRU队列,我想知道如何添加保护,以便我不向已消失的端点发送消息(服务器崩溃,OOM杀手,这些方面的任何事情。)
从我阅读的文档中可以看出,如果XREP转到不存在的终点,它就会丢弃该消息,并且我无法得到有关该消息的通知。有没有办法得到这样的通知?我应该先发出一个“ping”,如果我没有得到回应那么那个“工人”对我来说是死肉吗?我怎么知道我刚刚发送ping的是同一个客户端,我收到了消息?
或者我的用例对ZeroMQ来说不是一个好用的?我只是想确保收到一条消息,我不希望它在我不知情的情况下掉在地板上......
答案 0 :(得分:3)
让一个工人知道它是否存活会导致竞争条件:工人可能会在它死之前回答ping。
但是,如果您假设某个工作人员在期间处理(在这种情况下您可以做的很少),则可以撤消工作人员与中央队列之间的通信流。让工作人员从队列中获取请求(使用REQ
/ REP
连接)并在处理完成后让它与原始信封一起发送(使用与上面相同的套接字,或者通过单独的PUSH
/ PULL
连接更好。
在这种情况下,您知道不会发送死亡工作者请求,因为它将无法获取它们(已经死了......)。此外,您的中央队列甚至可以确保它在给定时间内收到每个请求的答案。如果没有,它可以将请求放回队列中,以便新工作人员在不久之后获取它。这样,即使工作人员在处理请求时死亡,最终也会提供请求。
(作为旁注:如果工作人员因特定请求而崩溃,请小心 - 您不希望逐个杀死您的工作人员,并且可能希望为请求设置最大尝试次数)
编辑:我写了some code来实施the other direction来解释我的意思。