Кейс: Feign-клиент без таймаута положил пул потоков сервиса

Сервис ходил во внутренний API через Feign-клиент с настройками по умолчанию. Через несколько месяцев в проде downstream начал изредка отвечать медленно — не падал, просто держал соединение открытым дольше обычного.

Там, где connectTimeout и readTimeout не заданы явно через feign.client.config, таймаут может оказаться на порядок больше, чем терпит SLA сервиса, — или зависеть от дефолтов конкретного Client под капотом. Запросы к медленному downstream копились: каждый занимал поток из пула Tomcat на неопределённое время.

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

Что спросят следом: почему один медленный downstream должен ронять весь сервис, а не только запросы, которые его касаются. Правильный ответ — bulkhead: выделенный пул потоков или коннектов под конкретную зависимость, чтобы её деградация не съедала ресурсы для остальных эндпоинтов.

Таймаут на HTTP-клиенте — не деталь конфигурации, а условие, без которого один медленный сосед останавливает весь сервис.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки