对在 NetMQ 中使用 SendHighWatermark 感到困惑

Confused with using SendHighWatermark in NetMQ

我正在使用 NetMQ 测试我的原型,特别是我正在学习 HighWatermark 选项的影响。

我已经理解并测试了以下案例:

在这种情况下,我看到客户端只能发送 10 条消息,然后在发送时阻塞。

然后我又做了一个处理速度慢的测试——路由器在收到每条消息后就休眠。在这种情况下,我希望 DEALER 快速发送 10 条消息并延迟发送另外 10 条消息。但是 DEALER 会毫不延迟地发送所有消息。

路由器的代码:

const string processingEndpoint = "tcp://127.0.0.1:6668";
using (var context = NetMQContext.Create())
using (var router = context.CreateRouterSocket())
{
    router.Bind(processingEndpoint);
    var msg = router.ReceiveMultipartMessage();
    Thread.Sleep(5000);  // emulate slow processing
}

经销商代码:

const string processingEndpoint = "tcp://127.0.0.1:6668";
string clientIdentity = "fast dealer";
using (var context = NetMQContext.Create())
using (var dealer = context.CreateDealerSocket())
{
    client.Options.Identity = System.Text.Encoding.Unicode.GetBytes(clientIdentity);
    client.Options.SendHighWatermark = 10;
    client.Connect(processingEndpoint);

    for (var i = 0; i < 20; i++)
    {
        var msg = new NetMQMessage();
        msg.Append(string.Format("{0}_Payload{1}", clientIdentity, i));
        client.SendMultipartMessage(msg);
        Console.WriteLine("Sent msg {0}", i);
    }
}

为什么在我的情况下经销商可以在处理缓慢时毫不延迟地发送?

一些原因,在第二次测试中,套接字已经连接,所以你发送经销商的高水位线和接收路由器的高水位线。如果你也将它设置为 10,那么你的总数就是 20。但是你也有套接字缓冲,默认情况下是 8mb