0

HWM は clrzmq 2.2.5 では動作しないようです。これが私のコードです

    private static ulong hwm = 50;
    static void testMQ()
    {

        var _Context = new Context(1);

        var pubSock = _Context.Socket(SocketType.PUB); 
        pubSock.HWM = hwm;  
        pubSock.Bind("tcp://*:9999");

        new Thread(testSub).Start(); 
        Thread.Sleep(1000); // client connect

        int i = 0;
        while (true)
        {
            pubSock.Send(i.ToString(), Encoding.ASCII);
            Debug.WriteLine(pubSock.Backlog + "/" + i++);
        }
    }

    static void testSub()
    {
        var _ZmqCtx = new Context(1);

        var subSock = _ZmqCtx.Socket(SocketType.SUB);
        subSock.HWM = 500;
        subSock.Identity = new ASCIIEncoding().GetBytes("bla");
        subSock.Connect("tcp://127.0.0.1:9999");

        Debug.WriteLine("connected");
        subSock.Subscribe("", Encoding.ASCII);
        while (true)
        {
            Debug.WriteLine("r:" + subSock.Recv(Encoding.ASCII));
            Thread.Sleep(10);
        }
    }

出力:

'quickies.vshost.exe' (Managed (v4.0.30319)):      
Loaded 'B:\sdev\MSenseWS\GoogleImporter\bin\Debug\clrzmq.dll', Symbols loaded.
connected
r:0
100/0
100/1
100/2 
[...]
100/13
r:1
100/14
[...] 
100/2988
100/2989
100/2990
100/2991
100/2992
100/2993
100/2994
100/2995
100/2996
r:179
100/2997
100/2998

予想される動作: 500 件のメッセージがキューに入れられると、pubSock.Send がブロックされます。経験した動作: pubSock.Sends はブロックされず、メモリ不足の例外 vom ネイティブ コード (clrzmq.dll) がスローされるまで永久に送信されます。

また: なぜバックログは常に 100 なのですか?

あなたの洞察をありがとう、アルミン

編集:プッシュ/ポーリングソケットは同じ結果を達成します

# #

解決策: - HWM はクリネットがコミット (受信) していない未処理のメッセージの数であると予想していたため、エラーは私の側にありました。実際には、HWM は、ネットワーク経由で送信するためにバッファリングされ、キューに入れられたメッセージの数です。

  • 私の場合、メッセージを十分に速く処理できないクライアントがあったため、メモリが不足するまでバッファスペースが割り当てられました。

  • この問題を解決するには、クライアント ソケットに HWM と SWAP を設定すると問題が解決することがわかりました。これは、メッセージが zmq によって大きなスワップ ファイルのキューに入れられ、アプリケーションによって連続して処理されるためです。

4

1 に答える 1

2

ああ、サブスクライバースレッドがスリープ状態になっていると思いますが、それは基盤となるZMQソケットスレッドもスリープ状態になるという意味ではありません。したがって、サブスクライバーは引き続きメッセージをパブリッシャーキューから削除します。言い換えると、使用することThread.Sleep()は、限られたネットワーク接続や、HWMにぶつかると予想されるその他の問題をシミュレートするのに十分な方法ではない可能性があります。

于 2013-03-19T14:33:46.760 に答える