ZeroMQ:发布给多个Worker并等待ACK

时间:2013-12-04 17:54:45

标签: zeromq

我正在开发一个应用程序,当重启即将发生时通知多个Workers,然后等待所有Workers执行某些任务,然后在重新启动之前发送ACK。工人的数量可以改变,所以我的应用程序需要知道当前订阅了多少工人,以便它知道每个工人都发送了一个ACK。

pub / sub方法是最好的方法吗?它是否提供了一种计算当前连接的订户数量的方法?我的应用程序是否应该使用REP套接字来监听来自Workers的ACK?是否有更优雅的设计方式?

由于

1 个答案:

答案 0 :(得分:4)

  

pub / sub方法是最好的方法吗?

使用服务器中的pub / sub来广播“服务器重启”消息对于获取消息的工作人员来说是好的,但它不是完全证明的。慢连接综合症可能会阻止工人(或工人)接收消息。为了解决这个问题,服务器一旦发布重新启动消息,就应该继续发布该消息,直到所有工作人员都用ACK响应,但这会产生一个新问题:服务器如何跟踪所有工作人员以确保它接收到所有必要的ACK?

  

它是否提供了一种计算出订阅者数量的方法   目前已连接?

没有。公开该信息会破坏ZeroMq的抽象模型,该模型隐藏了连接和连接对等体的物理细节。您可以通过pub / sub定期从服务器向工作人员发送心跳消息; worker使用逻辑节点id(WorkerNode1等)进行响应,并且服务器会跟踪哈希表中的每个worker以及将来的到期时间。当工作人员响应听力时,服务器只是重置该工作人员的未来期满;服务器应定期检查哈希表并删除过期的工作程序。

这是你追踪工人的最好方法。到期时间越短,工人列表反映的越准确。

  

我的应用程序是否应该使用REP套接字来监听来自Workers的ACK?是   有更优雅的设计方法吗?

REQ / REP套接字的用途有限。我在服务器上使用PUB来发送重启和心跳消息; ROUTER接收ACK。工作人员应使用DEALER发送ACK(以及其他任何内容),并使用SUB接收心跳/重新启动。 ROUTER和DEALER是双向的,完全异步,最通用;不会出错。

希望它有所帮助!