目标:在一次迭代中向所有订阅者发送大量消息。我有40k-100k的消息。我已经开始使用PUB / SUB套接字类型了。
问题:订阅者收到的消息数量低于发布者发送的消息数量。如果我在发送每条消息后添加一个Thread.Sleep(1),那么所有消息都会被传递,但是需要传递大量消息,这意味着延迟40-100秒。这是不可接受的。
下面的代码是在NetMQ(3.0.0)中,这是alpha版本,但它只是例如,因为我使用libzmq 3.2.4(稳定版)在c中实现了相同的代码。和simptoms是一样的。
发布商/服务器端:
using (var dbConn = new OracleConnection(ConfigurationManager.AppSettings["ConnString"]))
using (NetMQContext ctx = NetMQContext.Create())
{
using (var publisher = ctx.CreatePublisherSocket())
{
publisher.Bind(ConfigurationManager.AppSettings["PubSocket"]);
dbConn.Open();
NetMQMessage m = new NetMQMessage();
while (true)
{
var updateIds = new List<int>();
var deletedIds = new List<int>();
var changedRules = GetChangedItems(dbConn, ref updateIds);
var deletedRules = GetDeletedItems(dbConn, ref deletedIds);
foreach (var kvPair in changedRules)
{
var item= kvPair.Value;
publisher.Send(ToCsvLine(item));
//Thread.Sleep(1);
}
foreach (var kvPair in deletedRules)
{
var item = kvPair.Value;
publisher.Send(ToCsvLine(item));
//Thread.Sleep(1);
}
Thread.Sleep(1);
publisher.Send("end");
Console.WriteLine("Sent updated: {0}", updateIds.Count);
Console.WriteLine("Sent deleted: {0}", deletedIds.Count);
Thread.Sleep(6000);
}
}
订阅者/客户端:
using (NetMQContext ctx = NetMQContext.Create())
{
using (var consumer = ctx.CreateSubscriberSocket())
{
consumer.Connect("tcp://192.168.1.122:6005");
consumer.Subscribe("");
int count = 0;
while (true)
{
try
{
count++;
string msg = consumer.ReceiveString();
if (msg == "end")
{
Console.WriteLine("Count: {0}", count);
count = 0;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
}
}
答案 0 :(得分:4)
默认情况下,ZMQ将High Water Mark设置为1000。它也不是100%准确。我可以假设您可以达到或超过一批产品的至少一半吗?如果是这样,那可能是你的问题。将HWM设置为10,000或50,000(或者,出于测试目的,只需将其设置为0即可将其关闭),并查看结果如何变化。