Опрос на RouterSocket в NetMQ

У меня есть RequestSocket на стороне клиента, отправляющий запросы на сервер. Сервер должен иметь возможность обрабатывать запросы параллельно, поэтому я использовал RouterSocket с опросчиком.

Я не уверен, что это лучшая реализация, поскольку она использует достаточное количество ЦП, а запросы для обработки отсутствуют? В частности, событие SendReady в RouterSocket запускается очень часто.

class Program
{
    static ConcurrentQueue<NetMQMessage> outgoingQueue = new ConcurrentQueue<NetMQMessage>();

    static void Main(string[] args)
    {
        var poller = new Poller();
        using (var context = NetMQContext.Create())
        using (var router = context.CreateRouterSocket())
        {
            router.Bind("tcp://127.0.0.1:1337");
            poller.AddSocket(router);

            router.ReceiveReady += (s, a) => HandleRequest(a.Socket.ReceiveMessage());

            router.SendReady += (s, a) =>
            {

                if (!outgoingQueue.IsEmpty)
                {
                    NetMQMessage msg;
                    if (outgoingQueue.TryDequeue(out msg))
                    {
                        a.Socket.SendMessage(msg);
                        Console.WriteLine("Sent: " + msg[2].ConvertToString());
                    }
                }
            };
            poller.Start();
        }
    }

    static void HandleRequest(NetMQMessage requestMsg)
    {
        Console.WriteLine("Received: " + requestMsg[2].ConvertToString());
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            NetMQMessage responseMsg = new NetMQMessage();
            responseMsg.Append(requestMsg[0]);
            responseMsg.AppendEmptyFrame();
            responseMsg.Append("Enjoy " + requestMsg[2].ConvertToString());
            outgoingQueue.Enqueue(responseMsg);
        });
    }
}

person OMGKurtNilsen    schedule 04.08.2015    source источник
comment
какой вопрос?   -  person barakcaf    schedule 05.08.2015
comment
Отредактировано, чтобы добавить вопросительный знак...   -  person OMGKurtNilsen    schedule 05.08.2015


Ответы (2)


Вы не должны использовать SendReady, он будет вызываться каждый раз, так как маршрутизатор всегда готов к отправке. Как было предложено, попробуйте прочитать руководство по опросу. Также читайте про NetMQScheduler, его можно использовать вместо ConcurrentQueue.

http://somdoron.com/2013/06/netmq-scheduler/

person somdoron    schedule 06.08.2015

В сокет, который вы опрашиваете, можно добавить таймер, чтобы контролировать частоту опроса, как указано в руководстве по netMQ:

Если вы хотите периодически выполнять какую-либо операцию и вам нужно, чтобы эта операция выполнялась в потоке, которому разрешено использовать один или несколько сокетов, вы можете добавить NetMQTimer в опросчик вместе с сокетами, которые вы хотите использовать.

попробуйте эту ссылку для получения дополнительной информации: Руководство по NetMQ — опрос

person barakcaf    schedule 06.08.2015