我正在开发一个应用程序,当重启即将发生时通知多个Workers,然后等待所有Workers执行某些任务然后在重新启动之前发送ACK.工人的数量可以改变,所以我的应用程序需要知道当前订阅了多少工人,以便它知道每个工人都发送了一个ACK.
pub/sub方法是最好的方法吗?它是否提供了一种计算当前连接的订户数量的方法?我的应用程序是否应该使用REP套接字来监听来自Workers的ACK?是否有更优雅的设计方式?
谢谢
发布/订阅方法是执行此操作的最佳方法吗?
使用来自服务器的 pub/sub 广播“服务器重启”消息对于收到消息的工作人员来说很好,但这不是完全证明。慢加入者综合症可能会阻止工人(或工人)接收消息。为了解决这个问题,服务器一旦发布了重启消息,就应该继续发布该消息,直到所有工作人员都用 ACK 响应,但这会产生一个新问题:服务器如何跟踪所有工作人员以确保它收到所有必要的 ACK?
它是否提供了一种方法来确定当前连接了多少订阅者?
不。公开这些信息会破坏 ZeroMq 的抽象模型,该模型隐藏了连接和连接对等点的物理细节。您可以通过 pub/sub 定期从服务器向工作人员发送心跳消息;worker 用一个逻辑节点 id(WorkerNode1 等)响应,服务器在哈希表中跟踪每个 worker 以及未来的到期时间。当一个worker响应一个heartbeat时,服务器简单地重置那个worker的未来到期时间;服务器应该定期检查哈希表并删除过期的工作人员。
这是跟踪工人所能做的最好的事情。过期时间越短,工人名单反映的就越准确。
我的应用程序是否应该使用 REP 套接字来监听来自 Workers 的 ACK?有没有更优雅的设计方式?
REQ/REP 套接字的用途有限。我会在服务器上使用 PUB 来发送重启和心跳消息;路由器接收ACK的。工作人员应该使用 DEALER 来发送 ACK(和其他任何东西),使用 SUB 来接收心跳/重启。ROUTER 和 DEALER 是双向的,完全异步的,最通用的;不会出错。
希望能帮助到你!