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?

0 ответов

Другие вопросы по тегам