Мы запускаем микросервисы spring-boot на k8s в Amazon EC2, используя undertow в качестве нашего встроенного веб-сервера.
Всякий раз, когда по какой-либо причине наши нижестоящие службы перегружены входящими запросами, а рабочая очередь нижестоящих модулей становится слишком большой (я видел, как эта проблема возникает на 400-м уровне), тогда spring-boot полностью прекращает обработку запросов в очереди, и приложение молчит.
Наблюдая за размером очереди с помощью JMX, мы видим, что размер очереди продолжает расти по мере того, как больше запросов ставится в очередь рабочим IO, но к этому моменту никакие запросы в очереди никогда не обрабатываются никакими рабочими потоками.
Мы не видим никаких выходных данных журнала или чего-либо, указывающего, почему это может происходить.
Эта проблема распространяется каскадом вверх по течению, в результате чего парализованные нижестоящие модули вызывают ту же проблему с трафиком в вышестоящих модулях, и они тоже перестают отвечать — даже когда мы отключаем весь входящий трафик через шлюз API.
Чтобы решить эту проблему, мы должны остановить входящий трафик вверх по течению, а затем убить все затронутые поды, прежде чем вернуть их в большем количестве и снова включить трафик.
У кого-нибудь есть идеи по этому поводу? Это ожидаемое поведение? Если да, то как мы можем сделать отказоустойчивые соединения до того, как размер очереди станет слишком большим и убьет службу? Если нет, то что вызывает такое поведение?
Большое спасибо. Аарон.