Представь, что ты сделал собственное приложение, и оно стало популярным! Каждый день к тебе приходят новые клиенты, а на банковском счету быстро растут цифры. Но однажды ты заходишь на свой сайт и понимаешь, что он просто не работает.
Ты начинаешь смотреть метрики сервиса, а там настоящий кошмар. Приложение стало настолько массовым, что из-за большого числа запросов твоя система не выдержала. Ну что ж, время научиться ее масштабировать.
Масштабирование — процесс, в ходе которого сервис начинает выдерживать большую нагрузку.
Когда стоит масштабироваться
Чтобы понять, когда стоит масштабироваться, стоит посчитать нагрузку на сервис (что мы только что сделали в прошлой главе). А теперь давай посмотрим, какие есть способы масштабирования.
Признаки хорошего масштабирования
В процессе масштабирования легко ошибиться и сделать систему только хуже.
Давай посмотрим, на что ориентироваться:
- При грамотном масштабировании удается сохранять низкое время отклика даже при большом RPS.
- Пропускная способность системы не падает.
- В случае роста нагрузки наша система деградирует контролируемо — то есть время отклика растет постепенно.
- А в случае резкого скачка нагрузки система умеет защитить себя, чтобы не упасть.
Третий и четвертый пункты мы разберем более подробно дальше, а вот первые посмотрим уже сейчас.
Есть два варианта масштабироваться.
Масштабируем вверх
Если пользователи нахлынули на твой сервис, самый простой способ не испортить впечатление — это сделать масштабирование вверх (синоним — вертикальное масштабирование).
Вертикальное масштабирование (scale-up) — масштабирование сервиса за счет увеличения вычислительных мощностей. Например, увеличение оперативной памяти, процессоров или дисков.
Плюсы
- Если сервис находится в облаке, сделать это достаточно просто
- Хорошо работает для монолитных приложений
Минусы
- Нельзя бесконечно увеличивать оперативную память и другие ресурсы, ведь есть аппаратные ограничения и можно быстро «упереться в потолок»
Что по итогу: масштабирование вверх подходит при резком наплыве клиентов и может помочь выдержать повышенный RPS. Но в долгосрочной перспективе это проигрышная модель из-за технических пределов по мощностям.
Масштабируем горизонтально
Если ты проектируешь высоконагруженную систему, рано или поздно ты будешь думать как обеспечить доступность системы даже для 10 или даже 100 миллионов клиентов — и не просто наращивая число процессоров. Тут тебе поможет горизонтальное масштабирование.
Горизонтальное масштабирование (scale-out) — масштабирование за счет добавления новых экземпляров сервиса. Другими словами, теперь нагрузка будет приходиться на несколько экземпляров нашего сервиса.
Плюсы
- Позволяет существенно повысить пропускную способность системы с перспективой на дальнейший рост нагрузки
- Хорошо справляется с критическими ситуациями, даже если один из инстансов сервиса вышел из строя
Минусы
- Сложность реализации — достаточно сложно сразу учесть все нюансы и верно построить хорошо масштабируемую систему
- Увеличивает число компонентов системы и осложняет ее поддержку
Что по итогу: горизонтальное масштабирование в моменте сложнее реализовать, чем вертикальное, но это более перспективный подход с заделом на будущее — он существенно позволит увеличить и пропускную способность, и отказоустойчивость системы.