2011-10-21 202 views
0

我有一個要求,即PHP Web應用程序將消息寫入非阻塞隊列,並且其他進程會將它們出列。我目前的設計是PHP應用程序創建一個ZMQ.PUSH套接字,做一個connect到目的地址和send的消息。在目的地,一個進程(Java)創建一個ZMQ.PULL套接字,在同一個地址和receive上執行bind消息。但是,當出列器進程關閉(或未啓動)時,PHP應用程序在此期間發送的消息會丟失(當進程在同一地址上再次啓動時,不會將其發送到出隊器)。這是PHP應用程序每次創建新的ZMQ.Context的問題嗎?ZMQ PUSH/PULL模型:當節點按下消息並退出時丟失消息

作爲一個例子,我創建了另一個Java進程來將消息寫入隊列。

public static void main(String[] args) { 
    ZMQ.Context context = ZMQ.context(1); 
    ZMQ.Socket socket = context.socket(ZMQ.PUSH); 
    socket.connect("tcp://localhost:5557"); 

    for(int i = 0; i < 10; i++) { 
     socket.send(("Sending : " + message).getBytes(), 0); 
    } 
} 

如果上述過程在上述過程完成時未啓動,那麼這與丟失消息具有相同的問題。

但是,在上述方法主體的末尾添加一個while(true) {}不會導致任何丟失的消息 - 所有消息都在出列隊列啓動時傳遞。那麼我是否正確地假設ZMQ.Context對象被垃圾回收導致問題在這裏?如果是,那麼如何在PHP Web應用程序中解決這個問題?由於我無法堅持ZMQ.Context的對象。

回答

0

您在尋找所謂的durable消息。

看看zmq_setsockopt特別是ZMQ_IDENTITY選項作爲您的解決方案的第一步。

請確保您閱讀了手冊中關於High-Water Marks的章節,以便在閱讀器脫機一段時間後不會太落後。

好運