Медленный внешний API кладёт сервис целиком
Сервис на Spring MVC (блокирующая модель, пул потоков сервлет-контейнера) вызывает сторонний API через HTTP-клиент, у которого не заданы таймауты. Сторонний сервис деградировал: отвечает за 30-60 секунд вместо обычных 100 мс.
Через несколько минут сервис перестаёт отвечать целиком — таймаутами и 5xx завершаются даже те эндпоинты, которые вообще не ходят в этот API. Каково объяснение и что делать в первую очередь?
- Причина в сборщике мусора: длинные ответы удерживают объекты в памяти, помогает увеличение размера heap
- Каждый запрос удерживает поток сервлет-контейнера, медленные вызовы копят занятые потоки и пул исчерпывается: нужны таймауты, отдельный пул и circuit breaker
- Дело в переиспользовании HTTP-соединений: надо отключить пул соединений и открывать новое соединение на каждый вызов
- Достаточно увеличить размер пула потоков сервлет-контейнера — с запасом потоков хватит и на медленные вызовы, и на остальные
