6

私は .NET から ZeroMQ を利用していますが、奇妙な問題を修正しようとして行き詰まりました。タイプ PUSH のソケットと、タイプ PULL over TCP のソケットがあります。クライアントが切断されても、サーバーは引き続きメッセージを送信できます (Socket.Send メソッドにフラグが渡されないことに注意してください)。これは、ブロックを開始し、クライアントが再接続してメッセージを配信するのを待つ前に完全に取得されます。後に送信します。

メッセージが失われないようにするにはどうすればよいですか (または、最悪の場合、クライアントが接続されているかどうかをテストし、そうでない場合は、失われても差し支えないダミー メッセージを送信します)。

前もって感謝します!

編集:さらにテストすると、クライアントによる切断後に最初のメッセージを送信してから1秒待つと、2番目のメッセージがブロックされることがわかりますが、まったく待たなければ、必要なだけメッセージを送信できます。すべて迷う。それはかなり紛らわしいです...

4

1 に答える 1

3

ZeroMQ のドキュメントでは、これは PUSH/PULL セットアップの問題であり、次のパターンを提案しています: サブスクライバーの固定数が予想される場合にノード調整を提供するための REP/REQ セットアップの追加。ただし、サブスクライバーの数を事前に知ることができない場合は、プロトコルを変更して、これらの条件に対する回復力を高めることを検討する必要があります。

C で同期されたパブリッシャー(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;
}
于 2011-04-04T13:59:18.103 に答える