Poller на 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);
});
}
}
2 ответа
Не следует использовать SendReady, он будет вызываться каждый раз, так как маршрутизатор всегда готов к отправке. Как предложено, попробуйте прочитать руководство по опросу. Также прочитайте о NetMQScheduler, вы можете использовать его вместо ConcurrentQueue.
Можно добавить таймер к сокету, который вы опрашиваете, чтобы контролировать частоту опроса, как указано в руководстве netMQ:
Если вы хотите периодически выполнять какую-либо операцию и хотите, чтобы эта операция выполнялась в потоке, которому разрешено использовать один или несколько сокетов, вы можете добавить NetMQTimer в Poller вместе с сокетами, которые вы хотите использовать.
попробуйте эту ссылку для получения дополнительной информации: руководство по NetMQ - опрос