Как отменить незаконченные, длительные запросы в Spring-boot с Undertow? - PullRequest
0 голосов
/ 23 июня 2019

У меня есть служба Spring-boot, использующая Undertow, основными клиентами которой являются датчики на клиентском сайте (~ 250 таких устройств).Эти датчики отправляют POST-сообщения в службу каждые 10 секунд по Wi-Fi на площадке, что местами несколько пятнисто.Я отслеживаю службу в NewRelic и вижу случайные времена ответа на запрос, которые составляют ЧАСЫ (типичное время ответа составляет несколько десятков миллис).На контроллере сервиса нет обработки - все полезные данные кэшируются вне потока и пересылаются через отдельный процесс.Примерно через 15 часов служба перестает отвечать на запросы и должна быть перезапущена.Я подозреваю, что эти длительные запросы насыщают пул потоков, используемых для обработки запросов от других датчиков.NewRelic предполагает, что все обнаруженные ошибки очень похожи на следующие:

I/O error while reading input message; nested exception is java.io.IOException: 
UT000128: Remote peer closed connection before all data could be read

У большого процента этих ошибок есть сообщения, предлагающие исключения в процессоре JSON Spring-boot, которые жалуются на недопустимые / неожиданные символы или закрытые вводы.

Это кажется , как будто некоторые датчики пытаются завершить свои POST.Это правильная интерпретация?

Есть ли способ заставить мой сервис «убить» эти запросы до того, как они сожрут все потоки моего обработчика?Я знаю, что автоматический выключатель на стороне клиента мог бы быть лучшим способом справиться с этим, но я пока не имею большого контроля над этой целью.

Я тоже невстроенный в Undertow как контейнер сервлетов - мне бы очень понравилось Tomcat или Jetty, если бы он немного облегчил шкуру этой кошки.

У меня есть следующий код в классе @Configuration:

@Bean
public ServletWebServerFactory servletWebServerFactory() {
    UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory(contextPath, serverPort);

    factory.addBuilderCustomizers((builder) -> {
        ...
        builder.setServerOption(UndertowOptions.IDLE_TIMEOUT, 60000);
        ...
    });
    return factory;
}

Но, похоже, это не убивает запросы.

...