2012-12-10 46 views
1

我是ZMQ的新手,我正在使用NodeJS綁定。我有一個使用PUSH/PULL套接字的應用程序。一方面我將PUSH數據發送到通過PULL套接字接收並處理它的某些節點。有時我必須殺死我的應用程序的一個或多個節點,並且可能會發生這些節點仍然在要處理的PULL套接字中有一些數據。我不想丟失這些數據,所以我想知道是否有辦法訪問ZMQ的PULL套接字隊列來檢查是否仍有消息需要處理。ZMQ套接字隊列

我實際上在ZMQ和NodeJS綁定的規範中找不到任何東西,所以也許我弄錯了整個概念。

回答

0

我發佈了我找到的解決方案。這不是一個真正的解決方案,因爲我沒有使用ZMQ套接字來檢查隊列中是否沒有更多的消息,這只是一個解決方法/破解,讓我腦海中想出了一個辦法。我沒有時間自己寫隊列處理,所以這裏是我如何解決問題:

只要進程接收到要處理的消息,它們就會通過new Date().getTime()存儲時間戳。每當一個進程需要被終止,一個kill消息被髮送給它。當進程收到消息時,它會以setInterval開始超時。每x秒(我把10,可以更多或更少)超時會觸發一個函數,檢查最後收到的消息是否足夠長(需要一個時間戳,將這個ts減去最後一個保存的結果,如果結果大於y ,在我的情況下是100秒,它已經夠老了)。如果是,則表示沒有收到更多消息(隊列中沒有更多消息),因此它會終止進程,否則不會執行任何操作。

0

如果殺死進程,那麼進程緩衝區中的任何數據都將丟失。

您應該始終找到一種方法來讓流程能夠優雅地關閉,而不是強行終止進程。在這裏,你可以發送一個「KILL」消息給PULL套接字;該過程可以讀取它並在收到它時退出。如果可以刷新套接字緩衝區(取決於是否還有其他進程仍在發送給它),那麼可以這樣做,然後在沒有更多消息要讀取時退出。

+0

嗯,謝謝,這就是我的想法。我的問題更多的是「如何在殺死socket之前檢查是否還有消息需要處理?」。 – Masiar

+0

這取決於你的體系結構。如果有推動者連續發送,隊列將永遠不會保證爲空。如果推銷者知道會話何時結束,他們可以添加一個「終止」消息來指示這一點。 –

+0

Pushers將繼續發送內容,但每當我開始一個「kill」過程時,這些Pushers就會從worker中解除綁定,因此worker不會收到更多消息,但可能還有一些仍然未在隊列中處理。我需要檢查隊列的狀態並獲得正確的時刻來終止進程。 – Masiar