NetMQ RouterSocket перестает отвечать через некоторое время
Среда
NetMQ Version: 4.0.0.1
Operating System: Windows Server 2014
.NET Version: .NET 4.7
вопрос
У меня есть служба Windows, которая принимает запросы от.NET Web API. Сервис создает экземпляр RouterSocket, чтобы он мог получать много сообщений со слоя веб-API и перенаправлять его во внутреннюю систему. Внутренняя система возвращает ответ, который отправляется обратно на уровень веб-службы, который направляет ответ клиенту.
Вот код
private RouterSocket _socket;
public void StartServer()
{
_socket = new RouterSocket();
_socket.Bind(_netmqConnStr);
while (_listening)
{
var msg = _socket.ReceiveMultipartMessage();
var identity = msg.Pop().ConvertToString();
var x = msg.Pop().ConvertToString(); // empty frame
var data = msg.Pop().ConvertToString();
_logger.Debug($"Incoming Message - Identity: {identity}, Data: {data}"); // I see logs for a while then nothing!
ForwardMessage(identity, data);
}
}
public async Task SendMessage(string identity, int errorCode, string response)
{
NetMQMessage message = new NetMQMessage();
message.Append(System.Text.Encoding.ASCII.GetBytes(identity));
message.AppendEmptyFrame();
message.Append(errorCode);
message.Append(response);
_socket.SendMultipartMessage(message);
_logger.Debug(String.Format("Send to WebAPI - Error code: {0}, Response: {1}", errorCode, response));
}
Из WebAPI я подключаюсь к службе Windows (работающей на том же сервере), используя этот код:
public async Task<IHttpActionResult> Post(MyModel inputModel)
{
using (var requestSocket = new RequestSocket())
{
requestSocket.Options.Identity = System.Text.Encoding.ASCII.GetBytes(GetUniqueID());
try
{
requestSocket.Connect(Constants.BackEndAddress);
}
catch(Exception e)
{
_logger.Error(e);
return InternalServerError();
}
NetMQMessage message = new NetMQMessage();
message.Append(JsonConvert.SerializeObject(inputModel));
try
{
requestSocket.SendMultipartMessage(message);
}
catch(Exception e)
{
_logger.Error($"Unable to submit message to Windows Service: {soupMsg}");
return InternalServerError(new Exception("Unable to foward your message."));
}
if (!requestSocket.TryReceiveMultipartMessage(TimeSpan.FromSeconds(5), ref message))
{
_logger.Error("Did not receive a response from the Windows Service in the time allotted.");
return InternalServerError(new Exception("Did not receive a response from the gateway in the time allotted."));
}
var errorCode = message.Pop().ConvertToInt32();
var result = message.Pop().ConvertToString();
var status = false;
_logger.Info(result);
switch (errorCode)
{
case 0:
return BadRequest(result);
case 1:
return Ok();
default:
return InternalServerError(new Exception("Unknown error"));
}
}
}
}
Используя Postman's Collection Runner (два экземпляра для симуляции 2 клиентов), я пытаюсь отправлять 1000 сообщений каждую секунду. Когда я начинаю отправлять сообщения, я вижу входящее сообщение, записанное в базу данных.
Через некоторое время, около 430 сообщений в сумме (по 1/2 от каждого участника), я перестаю видеть записи в журнале входящих сообщений. Вместо этого я начинаю видеть Did not receive a response from the Windows Service in the time allotted.
ошибка из веб-API TryReceiveMultipartMessage(TimeSpan.FromSeconds(5)
, Я не получаю исключения при вызове SendMultipartMessage из уровня API.
Почему служба Windows не получает сообщения, отправленные API? Почему API считает, что оно успешно отправило сообщение в службу Windows?