【问题标题】:What is the proper way to wait for connections?等待连接的正确方法是什么?
【发布时间】:2014-05-08 02:13:12
【问题描述】:

我正在尝试使用 NetMQ 在两个应用程序之间实现一个简单的消息传递(下面对我要实现的目标进行了稍微详细的描述)。
经过一些试验和错误后,我发现我不能在 Connect/Bind 调用后立即发送或接收消息,因为它们是非阻塞的,即使连接尚未建立,它们实际上也会返回。 现在我用 Thread.Sleep() 解决了这个问题,但这对它的品味很差,而且绝对不适合生产系统。

所以问题是,在 NetMQ/ZeroMQ 中应该如何做呢?

客户端示例:

        using (NetMQContext ctx = NetMQContext.Create())
        {
            using (var client = ctx.CreatePushSocket())
            {
                client.Connect("tcp://127.0.0.1:5555");
                Thread.Sleep(100); // wait for connection

                for (int i = 0; i < 5; i++) 
                {
                    client.Send("test " + i , true);
                }
            }
        }
    }

服务器示例:

    using (NetMQContext ctx = NetMQContext.Create())
    {
        using (var server = ctx.CreatePullSocket())
        {
            server.Bind("tcp://127.0.0.1:5555");
            Thread.Sleep(100); // wait for connection
            while (true)
            {
                var str = server.ReceiveString();
                Console.Out.WriteLine(str);
                Thread.Sleep(60*1000); // do msg processing
            }
        }
    }

描述我想要达到的目标:

客户端 - 将消息发送到单个服务器。当服务器不可用时,客户端不应阻塞也不应丢弃消息。客户端可以随时离线/在线。

服务器 - 从单个客户端接收消息。服务器阻塞,直到收到消息。服务器需要对消息进行长时间的处理,并且在处理时不应丢失任何其他消息。服务器可以随时下线/上线。

【问题讨论】:

  • netmq网站上的例子没有将true传入Send。

标签: c# zeromq netmq


【解决方案1】:

receive 和 send 都可以等待直到可以执行,您将 true 传递给示例中的 dontWait 参数,只需将其删除,它会在可以发送消息时发送。

对于接收,您不必睡觉,因为它会等到消息可用。

建议使用 Poller 也是一种解决方案(您可以轮询套接字何时可以发送以及何时可以使用消息),请查看 poller 类的测试:https://github.com/zeromq/netmq/blob/3.3.3-rc5/src/NetMQ.Tests/PollerTests.cs。

【讨论】:

    【解决方案2】:

    在服务器端休眠的最佳解决方案是创建一个套接字轮询器并在拉式套接字上进行轮询,直到收到消息。这避免了浪费的睡眠,并使代码通常更紧凑。

    在客户端,最好的解决方案可能是创建两个套接字(一个用于发送消息,一个用于接收),并让服务器宣布其存在,以便客户端发送消息。由于 ZeroMQ 在处理多个连接方面效率很高,因此该解决方案将非常有效。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 2017-09-13
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多