Какие виды масштабирования архитектуры существуют, вертикальное и горизонтальное
Что проверяют
Понимаете ли вы цену каждого подхода, а не только определения. Следом обычно спрашивают, что поменять в Spring-сервисе, чтобы запустить его в десяти экземплярах, и что станет узким местом.
Как отвечать
Два определения, коротко:
- вертикальное (scale up): больше CPU и памяти той же машине. Код не меняется, но есть потолок железа, единственная точка отказа и простой на время апгрейда;
- горизонтальное (scale out): больше экземпляров за балансировщиком. Растут и пропускная способность, и отказоустойчивость, но приложение должно быть к этому готово.
У вертикального пути в Java своя специфика. Больше памяти значит больше куча, а на больших кучах нужен сборщик с короткими паузами: G1 по умолчанию, ZGC или Shenandoah, если паузы критичны. В контейнере размер кучи задают через -XX:MaxRAMPercentage, по умолчанию JVM берёт лишь четверть лимита. Лишние ядра помогут, только если пулы потоков не зашиты фиксированным числом.
Для горизонтального перечислите, что сделать с сервисом:
- stateless: сессии в Redis через Spring Session или JWT, файлы в объектное хранилище, а не на локальный диск;
- фоновые задачи:
@Scheduledзапустится на каждом экземпляре, нужна распределённая блокировка вроде ShedLock; - идемпотентность: балансировщик может повторить запрос на другой узел;
- автомасштабирование: в Kubernetes это HorizontalPodAutoscaler.
База масштабируется отдельно: реплики на чтение, партиционирование, шардирование. Хороший итог: приложение масштабируют горизонтально, а базу сначала вертикально, потому что так проще.
Где спотыкаются
Забывают про соединения с базой. У HikariCP пул по умолчанию 10 соединений, двадцать подов дают 200, а max_connections в PostgreSQL по умолчанию 100. Нужен PgBouncer или пересчёт пулов.
Называют горизонтальное масштабирование безграничным. Общий ресурс, будь то база, очередь или блокировка, быстро становится потолком, и новые экземпляры только усиливают конкуренцию за него.
Оставляют состояние в памяти: локальный кэш, сессии, счётчики. После второго экземпляра пользователи видят разные данные в зависимости от того, куда попал запрос.