zeromq - 0mq/NetMQ PUB/SUB 未传送所有消息

标签 zeromq netmq

目标:在一次迭代中向所有订阅者发送大量消息。我有 40k-100k 条消息。我已经开始使用 PUB/SUB 套接字类型。

问题:订阅者收到的消息数量低于发布者发送的消息数量。如果我在发送每条消息后添加 Thread.Sleep(1),则所有消息都会被传递,但由于需要传递的消息数量较多,这意味着 40-100 秒的延迟。这是 Not Acceptable 。

下面的代码位于 NetMQ (3.0.0) 中,这是 alpha 版本,但这只是示例,因为我已经使用 libzmq 3.2.4(稳定)在 c 中实现了相同的代码。和 simtoms 是一样的。

发布者/服务器端:

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();
        }
      }
    }
}

最佳答案

ZMQ 设置 High Water Mark默认为 1000。它也不是 100% 准确。我可以假设您可以在单个批处理中达到或超过至少一半吗?如果是这样,那可能是你的问题。将 HWM 设置得更高,为 10,000 或 50,000(或者,出于测试目的,只需将其设置为 0 将其关闭),然后查看结果如何变化。

关于zeromq - 0mq/NetMQ PUB/SUB 未传送所有消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23991753/

相关文章:

c#-4.0 - 发布者和订阅者中的 NetMQ 不工作

c# - 在 ZeroMQ C# 中断开套接字

php - 如何在 Alpine Linux 容器上安装 ZeroMQ for PHP?

node.js - NODE_MODULE_VERSION 46.这个版本的Node.js需要NODE_MODULE_VERSION 64.请尝试重新编译或重新安装

zeromq - 使用 zeromq 设计具有多个代理的发布订阅系统

c# - ZeroMQ 服务器/客户端类型的正确模式

c++ - NanoMsg (NNG) 和 FlatBuffers 是否适合该项目?

c# - ZeroMQ线程/任务建议

c# - NetMQ接收/响应在循环时不起作用

zeromq - NetMQ 为什么 Req-Rep 需要 "SendReady"?