Каждый сервис на Go, который ходит в соседний, использует
http.Transport, даже не вспоминая о нём. У MaxIdleConnsPerHost значение по умолчанию равно двум, и это самая частая ошибка конфигурации в парках микросервисов на Go.Арифметика простая. Сервис на 500 запросах в секунду с медианой 20 мс держит около десяти одновременных соединений. Восемь закрываются после каждого запроса, и каждый следующий поход платит за рукопожатие TCP, а на TLS ещё и за проверку сертификата. Ошибок в логах нет, всё выходит наружу только хвостом времени ответа.
Вторая ловушка в дозвоне: при пустом пуле горутины уходят звонить разом, и без
MaxConnsPerHost это выжигает дескрипторы и порты. Поставите лимит, получите очередь, и отвал по дедлайну будет выглядеть как таймаут соседа. Открывайте материал с конфигом транспорта и смотрите, как этого избежать.#golang