Мой API отключается после ~ 4000 запросов подряд - PullRequest
0 голосов
/ 04 августа 2020

Этот API, над которым я работаю (. NET Core 2.1), используется в пакетном процессе. Конечная точка, вызываемая в этом рабочем процессе, представляет собой сообщение, которое принимает int из маршрута и вызывает метод из класса обслуживания.

    [HttpPost("region/model/{propertyNum:int}"), SecurableAction("RegionModel")]
    public IActionResult AddModelMessageRequest(int propertyNum)
    {
        return _svc.BatchService.RequestModel(propertyNum).ToResult();
    }

Все, что делает этот метод, - это помещает сообщение в очередь rabbitMQ для использования другое развертывание на том же сервере. Вы увидите, что к ответу Api ничего не добавлено. Вся цель этой очереди - выгрузить лог c, выполненный потребителем-кроликом, из пакетного процесса.

    public IApiResponse RequestModel(int propertyValue)
    {
        var response = new ApiResponse();
        try
        {
            var startCmd = new RequestModelMessage
            {
                PropertyName = propertyValue
            };
            _rabbitRepo.SendModelRequest(startCmd);

            return response;
        }
        catch (Exception ex)
        {
            response.AddError(Globals.Messages.GeneralError).Catch(ex);
            var log = _logger.Error.Catch(ex).Write();
            response.CorrelationID = log.UUID;
            return response;
        }
    }

Это код, который помещает сообщение кролика в очередь:

    public void SendModelRequest(RequestModelMessage msg)
    {
        SendMessage(QBuilder.ExchangeName, QConfig.Wcx.Keys.ToModelQ, msg);
    }
    
    public void SendMessage(string exchange, string routeKey, object message)
    {
        _channel.BasicPublish(exchange: exchange,
                                routingKey: routeKey,
                                mandatory: false,
                                body: Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)));
    }

Вначале go все вроде нормально. Сообщения добавляются в очередь, потребитель-кролик потребляет сообщения и выполняет логические c и sql вставки, для которых он предназначен. Когда я дохожу до 4000-го запроса или около того, API просто отключается. API больше не отправляет сообщения в очередь кроликов. Не существует специального c ограничения, по которому сама очередь кроликов попадает, в очереди кроликов может быть от 250 до 1000 сообщений, когда это происходит, но это всегда примерно 4000-й вызов API для указанного выше сообщения.

Развертывание, которое использует сообщения (которое находится на том же сервере, что и API), продолжает работать нормально. Он продолжает обрабатывать очередь после того, как API прекратил добавлять сообщения в очередь. API и потребитель очереди совместно используют проекты классов обслуживания. Если я перезапущу API, пока внешний пакетный процесс все еще запущен, API возобновит добавление сообщений в очередь, причем пакетный процесс, по сути, просто пропустит этап вызова API (или он не ждет, какой ответ от API есть) для элементов, которые он обработал, пока API не работает.

Кто-нибудь видит здесь что-нибудь, что могло бы заставить меня уничтожить память API? Или по любой другой причине он будет продолжать отключаться после повторения-i sh количества вызовов, полученных на эту конечную точку?

Спасибо за ваше время.

...