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不会阻塞并永远发送,直到内存不足,引发本机代码(clrzmq.dll)。
另外:为什么积压总是100?
感谢您的见解, 阿明
编辑:push / poll套接字实现相同的结果
# #
分辨率: - 错误在我身边,因为我期望HWM是clinet未提交(接收)的未完成消息的数量。实际上,HWM是缓冲并排队等待通过网络发送的消息数。
在我的情况下,我有一个客户端无法足够快地处理消息,因此缓冲空间被分配,直到内存不足。
为了解决这个问题,我发现在客户端套接字上设置HWM和SWAP解决了我的问题,因为消息由zmq排队到一个大的交换文件,并且被应用程序连续占用。
答案 0 :(得分:2)
啊,所以我猜你有订阅线程休眠,但这并不意味着底层的ZMQ套接字线程也会休眠。因此,订户将继续从发布者队列中取消消息。换句话说,使用Thread.Sleep()
可能不足以模拟有限的网络连接或您希望导致进入HWM的其他问题。