如何从ZeroMQ或NetMQ中的路由器套接字发送和接收?

时间:2016-10-10 22:32:50

标签: c# .net zeromq netmq

我有经销商< - > NetMQ v4 中的路由器设置,我可以在任何方向异步发送和接收消息,没有任何问题。

我现在想要将其形式化为一个抽象,其中服务器(路由器)侦听任何传入消息,但它还需要按需向任何连接的客户端广播消息(经销商)。

我试图避免使用Pub< - >子套接字因为我需要订阅者也向服务器发送消息。与我想要实现的最接近的模式是WebSocket客户端 - 服务器通信。

收听客户端消息的第一部分是:

using (var server = new RouterSocket("@tcp://*:80"))
{
    var addresses = new HashSet<string>();

    var msg = new NetMQMessage();
    while (true)
    {
        var clientHasMsg = server.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1), ref msg);
        if (!clientHasMsg)
        {
            // Check any incoming broacast then loop through all the clients
            // sending each the brodcast msg
            var broadMsg = new NetMQMessage();
            foreach (var item in addresses)
            {
                broadMsg.Append(item);
                broadMsg.AppendEmptyFrame();
                broadMsg.Append("This is a broadcast");
                server.SendMultipartMessage(broadMsg);
                broadMsg.Clear();
            }

            // Go back into the loop waiting for client messages
            continue;
        }

        var address = Encoding.UTF8.GetString(msg[0].Buffer);
        var payload = Encoding.UTF8.GetString(msg[2].Buffer);
        Console.WriteLine("[Server] - Client: {0} Says: {1}", address, payload);

        var contains = addresses.Contains(address);
        if (!contains) { addresses.Add(address); }

        msg.Clear();
        msg.Append(address);
        msg.AppendEmptyFrame();
        msg.Append("Reply for: " + address);
        server.SendMultipartMessage(msg);
    }
}

现在假设套接字不是线程安全的,我一直在寻找一种方法来向所有客户端广播消息(来自不同的线程)。

我可以在循环中使用6.6.0方法而不是设置超时,之后我可以检查队列中是否有任何广播消息,然后遍历发送此类消息的每个客户端。类似的东西:

6.6.0

这在某种程度上感觉不对,主要是因为:

  • 超时的值是多少? 1秒,100毫秒等;
  • 这是最有效/最佳的解决方案,因为该程序将用于连接每个发送数千条消息的100k +客户端。

非常感谢任何有关最佳方法的指示。

2 个答案:

答案 0 :(得分:1)

您可以使用netmqqueue,它是多生产者单个消费者队列。您可以将其添加到NetMQPoller并从多个线程入队而无需锁定。

答案 1 :(得分:0)

我认为PUB / SUB是满足您对100k +客户要求的正确方法。然而,这并不意味着您无法与服务器进行通信:使用DEALER / ROUTER。为什么你认为这个解决方案是不可接受的?