ZeroMQ(NetMQ)经销商/路由器套接字可扩展性问题

时间:2019-11-19 13:57:45

标签: c# sockets .net-core zeromq netmq

环境

NetMQ Version:    4.0.0.239-pre
Operating System:  Linux / Windows
.NET Version:     NET Core 2.1

预期的行为

嗨 我有一个多客户端/单服务器方案,我围绕Dealer / Router套接字建模。 我正在尝试将1000个客户端连接到服务器,但是服务器能够接受第一个250-350。

实际行为

服务器接受的连接数上限为250-350。

再现行为的步骤

客户端代码

NetMQClient.cs

    public class NetMQClient
    {
        DealerSocket client = new DealerSocket("tcp://127.0.0.1:25702");
        NetMQQueue<NetMQMessage> messageQueue = new NetMQQueue<NetMQMessage>();
        public NetMQClient ()
        {
            messageQueue.ReceiveReady += MessageQueue_ReceiveReady;
            client.Options.Backlog = 1000;
            client.ReceiveReady += Client_ReceiveReady;
        }

        private void Client_ReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            while (e.Socket.TryReceiveFrameString(out string msg))
            {
                Console.WriteLine("REPLY From Server{0}", msg);
            }

        }

        public void StartSending(int id)
        {
            client.Options.Identity = Encoding.Unicode.GetBytes(id.ToString());
            var message = string.Format("Id = {0}", id.ToString());
            var bytes = Encoding.ASCII.GetBytes(message);


            using (var poller = new NetMQPoller())
            {
                poller.Add(client);
                poller.Add(messageQueue);
                poller.RunAsync();

                var messageToServer = new NetMQMessage();
                messageToServer.Append(message);
                messageQueue.Enqueue(messageToServer);
            }
        }

        private void MessageQueue_ReceiveReady(object sender, NetMQQueueEventArgs<NetMQMessage> e)
        {
            while (e.Queue.TryDequeue(out NetMQMessage messageToServer, TimeSpan.FromMilliseconds(10)))
            {
                client.SendMultipartMessage(messageToServer);
            }
        }
    }

Program.cs

    class Program
    {
        static void Main(string[] args)
        {
            Task.Factory.StartNew(() =>
            {
                for (var i = 1; i <= 1000; i++)
                {
                    var index = i;
                    Task.Factory.StartNew(() => new NetMQClient().StartSending(index));
                }
            });

            Console.WriteLine("Press any key to finish!");
            Console.ReadLine();
        }
    }

服务器代码

NetMQServer.cs

    public class NetMQServer
    {
        static RouterSocket server;
        public void StartListening()
        {
            Console.WriteLine("Started and listening");
            server = new RouterSocket("@tcp://127.0.0.1:25702");
            server.Options.Backlog = 1000;
            server.ReceiveReady += Server_ReceiveReady;

            using (var poller = new NetMQPoller())
            {
                poller.Add(server);
                poller.RunAsync();
                Console.ReadLine();
            }
        }

        private void Server_ReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            var fromClientMessage = new NetMQMessage();
            while (server.TryReceiveMultipartMessage(ref fromClientMessage))
            {
                var clientAddress = fromClientMessage[0];
                var clientOriginalMessage = fromClientMessage[1].ConvertToString();
                Console.WriteLine("From Client: {0}", clientOriginalMessage);

                var messageToClient = new NetMQMessage();
                messageToClient.Append(clientAddress);
                messageToClient.Append(clientOriginalMessage);
                e.Socket.SendMultipartMessage(messageToClient);
            }
        }
    }

Program.cs

    class Program
    {
        static void Main(string[] args)
        {
            var server = new NetMQServer();
            Task.Factory.StartNew(() => server.StartListening());
            Console.ReadLine();
        }
    }

有什么办法可以做到这一点,还是上面的代码有什么问题? 谢谢您的投入。

该问题也已作为问题发布在NetMQ项目github存储库(https://github.com/zeromq/netmq/issues/832

0 个答案:

没有答案
相关问题