Springboot с undertow перестает отвечать на запросы, когда пул рабочих потоков становится слишком большим

Мы запускаем микросервисы spring-boot на k8s в Amazon EC2, используя undertow в качестве нашего встроенного веб-сервера.

Всякий раз, когда по какой-либо причине наши нижестоящие службы перегружены входящими запросами, а рабочая очередь нижестоящих модулей становится слишком большой (я видел, как эта проблема возникает на 400-м уровне), тогда spring-boot полностью прекращает обработку запросов в очереди, и приложение молчит.

Наблюдая за размером очереди с помощью JMX, мы видим, что размер очереди продолжает расти по мере того, как больше запросов ставится в очередь рабочим IO, но к этому моменту никакие запросы в очереди никогда не обрабатываются никакими рабочими потоками.

Мы не видим никаких выходных данных журнала или чего-либо, указывающего, почему это может происходить.

Эта проблема распространяется каскадом вверх по течению, в результате чего парализованные нижестоящие модули вызывают ту же проблему с трафиком в вышестоящих модулях, и они тоже перестают отвечать — даже когда мы отключаем весь входящий трафик через шлюз API.

Чтобы решить эту проблему, мы должны остановить входящий трафик вверх по течению, а затем убить все затронутые поды, прежде чем вернуть их в большем количестве и снова включить трафик.

У кого-нибудь есть идеи по этому поводу? Это ожидаемое поведение? Если да, то как мы можем сделать отказоустойчивые соединения до того, как размер очереди станет слишком большим и убьет службу? Если нет, то что вызывает такое поведение?

Большое спасибо. Аарон.


person Aaron Shaw    schedule 30.08.2019    source источник
comment
Вы когда-нибудь добились чего-нибудь с этим? Мы сталкиваемся с похожей ситуацией. Undertow просто перестает обрабатывать запрос, больше ничего не регистрирует. В конце концов модуль перезапускается, и масштабирование модуля кажется, что мы не устраняем основную причину.   -  person Namphibian    schedule 17.10.2019
comment
Мы обнаружили, что у нас есть пул соединений с утечкой db, который неопределенно долго ждал, пока соединение станет доступным. Похоже, undertow висит, но ждет соединения. Отладка выполнена.   -  person Namphibian    schedule 24.10.2019
comment
@Намфибия Круто. Мы так и не узнали, что это такое. Сейчас я ушел из проекта, но моим последним желанием было просто вернуться к tomcat.   -  person Aaron Shaw    schedule 27.10.2019


Ответы (1)


Я не совсем уверен, исправит ли это настройка весенней загрузочной версии/встроенного веб-сервера, но ниже показано, как вы можете масштабировать это с помощью Kubernetes/Istio.

  • датчик живости

Если livenessProbe настроен правильно, Kubernetes перезапускает модули, если они не активны. https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#define-a-liveness-http-request

  • Горизонтальный модуль автомасштабирования

Увеличивает/уменьшает количество реплик модулей на основе использования ЦП или пользовательских показателей. https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/

  • Вертикальный модуль автомасштабирования

Увеличение/уменьшение загрузки ЦП/ОЗУ устройства POD в зависимости от нагрузки. https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler

  • Автоматический анализатор кластера

Увеличение/уменьшение количества узлов в кластере в зависимости от нагрузки. https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler

  • Ограничение скорости Istio и механизм повторных попыток

Ограничьте количество запросов, которые служба будет получать, и используйте механизм повторных попыток для запросов, которые не удалось выполнить https://istio.io/docs/tasks/traffic-management/request-timeouts/ https://istio.io/docs/concepts/traffic-management/#network-resilience-and-testing

person Tummala Dhanvi    schedule 30.08.2019