Когда нагрузка убивает инфраструктуру?

Пока пользователей мало, почти любая архитектура кажется удачной. Один backend, одна база, пара инстансов — всё работает быстро, графики красивые, команда уверена, что инфраструктура готова к росту.

Настоящие проблемы начинаются позже.

Когда нагрузка растёт, приложение перестаёт быть просто кодом. Оно превращается в систему, где каждый компонент влияет на остальные. Любая задержка начинает распространяться по инфраструктуре как трещина по стеклу.

На одном проекте мы без проблем держали высокий RPS. Autoscaling в Kubernetes работал нормально, CPU не упирался в потолок, запас по памяти был огромный. Со стороны всё выглядело стабильно.

Проблема пришла оттуда, откуда её никто не ждал: вырос latency между сервисами внутри кластера. Разница была смешной — несколько миллисекунд. Но под высокой нагрузкой этого хватило, чтобы очередь запросов начала расти быстрее, чем backend успевал её разгребать.

Дальше всё пошло по классическому сценарию распределённых систем.

Frontend начал агрессивнее отправлять retry. Балансировщик продолжал считать деградирующие ноды «здоровыми». Redis получил всплеск соединений. База начала тормозить на блокировках. Сервисы увеличили количество запросов друг к другу почти в несколько раз.

Через двадцать минут инфраструктура сама создала себе DDoS. Именно в этот момент приходит понимание, что масштабирование никогда не сводится к добавлению серверов. Серверы сегодня стоят дёшево. Гораздо сложнее заставить сотни машин работать согласованно под постоянной нагрузкой.

High-load почти всегда упирается не в вычисления, а в взаимодействие систем между собой: в сеть, таймауты, connection pool, балансировку трафика, packet loss, очереди и поведение приложений при деградации.

Причём ломается всё очень нелинейно.

Система может месяцами работать на пределе, а потом внезапно упасть из-за одного неудачного retry policy или роста latency на 10 мс между датацентрами.

Поэтому крупные инфраструктуры выглядят избыточными. CDN, очереди, кэширование, rate limit, circuit breaker, репликация, traffic isolation — всё это появляется не ради красоты архитектуры. Эти механизмы нужны, потому что в распределённых системах отказ — нормальное состояние.

Хорошая high-load архитектура определяется не тем, насколько редко она падает.

А тем, насколько предсказуемо она ведёт себя в момент деградации.

Когда нагрузка убивает инфраструктуру? | Сетка — социальная сеть от hh.ru