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 によって大きなスワップ ファイルのキューに入れられ、アプリケーションによって連続して処理されるためです。