2011-02-23 103 views
6

我正在使用.NET中的ZeroMQ,並試圖修復一個奇怪的問題。 我有一個PUSH類型的套接字和一個TCP類型的PULL。 當客戶端斷開連接時,服務器仍然能夠發送一條消息(請注意,沒有標誌傳遞給Socket.Send方法),在開始阻塞並等待客戶端重新連接並傳遞消息之前,之後發送。ZeroMQ PUSH/PULL並丟失消息

我該如何避免丟失信息(或者在最壞的情況下測試客戶端是否連接,如果不發送虛擬信息,我可以承受)?

在此先感謝!

編輯:進一步測試表明,如果我通過客戶端斷開後發送的第一條消息後,等待1秒,第二個會阻止,但如果我沒有等到我可以發送儘可能多的郵件作爲我想要他們都會迷路。這很令人困惑......

回答

3

ZeroMQ文檔指出,這是PUSH/PULL設置的問題,並建議採用以下模式:添加REP/REQ設置以在您期待固定數量時提供節點協調的用戶。但是,如果您無法提前知道訂戶數量,則應考慮更改協議以使其更適應這些情況。

Synchronized publisher in C (from ZGuide)

// 
//  Synchronized publisher 
// 
#include "zhelpers.h" 

//  We wait for 10 subscribers 
#define SUBSCRIBERS_EXPECTED  10 

int main (void)  
{ 
    s_version_assert (2, 1); 
    void *context = zmq_init (1); 

   //  Socket to talk to clients 
    void *publisher = zmq_socket (context, ZMQ_PUB); 
    zmq_bind (publisher, "tcp://*:5561"); 

    //  Socket to receive signals 
    void *syncservice = zmq_socket (context, ZMQ_REP); 
    zmq_bind (syncservice, "tcp://*:5562"); 

    //  Get synchronization from subscribers 
    int subscribers = 0; 
    while (subscribers < SUBSCRIBERS_EXPECTED) { 
        //  - wait for synchronization request 
        char *string = s_recv (syncservice); 
        free (string); 
        //  - send synchronization reply 
        s_send (syncservice, ""); 
        subscribers++; 
    } 
    //  Now broadcast exactly 1M updates followed by END 
    int update_nbr; 
    for (update_nbr = 0; update_nbr < 1000000; update_nbr++) 
        s_send (publisher, "Rhubarb"); 

    s_send (publisher, "END"); 

    zmq_close (publisher); 
    zmq_close (syncservice); 
    zmq_term (context); 
    return 0; 
}