ZMQ套接字队列

时间:2012-12-10 10:09:13

标签: node.js zeromq

我对ZMQ很新,我正在使用NodeJS绑定。我有一个使用PUSH/PULL套接字的应用程序。一方面,PUSH数据通过PULL套接字接收并处理一些节点。有时我必须杀死我的应用程序的一个或多个节点,并且可能发生这些节点仍然在PULL套接字中有一些数据要处理。我不想丢失这些数据,所以我想知道是否有办法访问ZMQ的PULL套接字队列以检查是否还有要处理的消息。

我实际上在ZMQ和NodeJS绑定的规范中找不到任何东西,所以也许我的整个概念都错了。

2 个答案:

答案 0 :(得分:0)

如果您终止进程,则该进程缓冲区中的任何数据都将丢失。

不应强行终止进程,而应始终找到一种方法来允许进程正常关闭。在这里,您可以向PULL套接字发送“KILL”消息;然后,进程可以读取它并在收到它时退出。如果你可以刷新套接字缓冲区(取决于是否还有其他进程发送到它),你可以这样做,然后在没有更多消息要读取时退出。

答案 1 :(得分:0)

我发布了我发现的解决方案。这不是一个真正的解决方案,因为我没有使用ZMQ套接字来检查队列中是否没有更多的消息,这只是一个解决方法/黑客,我想到了使这个工作起作用。我没有时间自己编写队列处理,所以这就是我解决问题的方法:

每当进程接收要处理的消息时,它们都会通过new Date().getTime()存储时间戳。每当需要杀死进程时,都会向其发送kill消息。当进程收到消息时,它会以setInterval开始超时。每隔x秒(我放10,可以或多或少),超时会触发一个函数,检查最后收到的消息是否足够老(取一个时间戳,减去这个ts,最后一个保存,如果结果大于y,在我的情况下是100秒,它足够大了)。如果是,则表示不再收到消息(队列中不再有消息),因此它会终止进程,否则什么都不做。