Container‑aware GOMAXPROCS в Go 1.25: почему ваши сервисы в Kubernetes раньше вели себя странно

Что такое GOMAXPROCS, почему контейнерные лимиты ломали интуицию и как GO 1.25 меняет ситуацию, читайте далее...

Что такое GOMAXPROCS, почему контейнерные лимиты ломали интуицию и как GO 1.25 меняет ситуацию, читайте далее...

Оптимизация кода сервисов на Go под реальную нагрузку
Когда сервис на Go начинает «тормозить» под реальной нагрузкой, проблема почти всегда не в самом языке и даже не в алгоритмах. Чаще всего узкие места лежат на уровне работы с памятью, сериализации данных и неочевидных накладных расходов рантайма. Если сервис упирается в сеть, базу данных или внешние API — оптимизация кода даёт ограниченный эффект. Но в CPU-bound сценариях (парсинг JSON, агрегации, обработка данных) каждая лишняя аллокация и копирование начинают стоить дорого.
Ключевая особенность Go — автоматическое управление памятью через garbage collector. Это удобно, но под нагрузкой GC становится заметным фактором:

Retry и timeout кажутся базовыми механизмами отказоустойчивости.
Не прошел запрос — повторим. Ответ не пришел за 500 мс — оборвем. Кажется, что этого достаточно, чтобы система стала надежнее.
На практике в распределенных системах retry и timeout могут работать наоборот. Когда сервис уже деградирует, повторные запросы не сглаживают проблему, а усиливают ее. Клиенты начинают ретраить одновременно, нагрузка растет, и сбой распространяется дальше по цепочке зависимостей.
В этой статье разберем, как retry создает каскадные отказы, почему таймауты могут ухудшить ситуацию и какие механизмы — backoff, jitter и circuit breaker — помогают этого избежать