对在 NetMQ 中使用 SendHighWatermark 感到困惑
Confused with using SendHighWatermark in NetMQ
我正在使用 NetMQ 测试我的原型,特别是我正在学习 HighWatermark 选项的影响。
我已经理解并测试了以下案例:
- 带有 ROUTER 套接字的服务器尚未启动
- 同时带有 DEALER 套接字的客户端正在发送 20 条消息(SendHighWatermark 是 10)
在这种情况下,我看到客户端只能发送 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
我正在使用 NetMQ 测试我的原型,特别是我正在学习 HighWatermark 选项的影响。
我已经理解并测试了以下案例:
- 带有 ROUTER 套接字的服务器尚未启动
- 同时带有 DEALER 套接字的客户端正在发送 20 条消息(SendHighWatermark 是 10)
在这种情况下,我看到客户端只能发送 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