1

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

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

4

2 回答 2

0

如果您杀死一个进程,那么该进程缓冲区中的任何数据都将丢失。

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

于 2012-12-11T13:01:51.563 回答
0

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

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

于 2012-12-13T09:31:16.713 回答