Масштабирование: вертикальное, горизонтальное, stateless-сервисы
↑ 8.4 Backend System Design · ← Предыдущая · → Следующая
Зачем это на собесе
Базовый набор приёмов масштабирования и их ограничения.
Объяснение
| Подход | Суть | Ограничения |
|---|---|---|
| Вертикальное (scale up) | больше CPU/RAM на узле | предел железа, единая точка отказа, простой при увеличении |
| Горизонтальное (scale out) | больше узлов | нужна распределённость, состояние вне узла |
Stateless-сервисы: состояние (сессии, файлы, кэш) хранится вне процесса (Redis, БД, объектное хранилище), поэтому любой экземпляр обрабатывает любой запрос → легко добавлять реплики за балансировщиком и автоскейлить.
Масштабирование слоёв:
| Слой | Приёмы |
|---|---|
| Вход | DNS, CDN, балансировщики L4/L7, кэш на краю |
| Приложение | stateless-реплики, autoscaling по CPU/RPS/очереди, разделение на сервисы |
| Кэш | Redis Cluster, локальный L1, консистентное хэширование |
| База данных | индексы и оптимизация запросов → read replicas → кэш → партиционирование → шардирование |
| Асинхронность | очереди, фоновые воркеры, буферизация записи |
| Файлы | объектное хранилище + CDN |
| Поиск и аналитика | отдельные системы (Elasticsearch, ClickHouse) |
Шардирование: горизонтальное разбиение данных по ключу (хэш, диапазон, справочник). Вопросы: выбор ключа (равномерность, hot shards), перешардирование (консистентное хэширование), запросы между шардами, транзакции. Откладывайте шардирование, пока не исчерпаны реплики, кэш и оптимизация.
Репликация: лидер-фолловер (чтение с реплик, lag), мульти-лидер (конфликты), без лидера (кворумы).
Балансировка: round-robin, least connections, хэш по ключу (sticky), взвешенная; health checks для исключения нездоровых узлов.
Нюансы и подводные камни
- Состояние в памяти процесса (сессии, кэш) не масштабируется горизонтально без стороннего хранилища.
- Узкое место часто БД, а не приложение.
- Autoscaling запаздывает: планируйте запас и прогрев.
- Горячие ключи и неравномерные шарды сводят на нет выгоду.
- Масштабирование увеличивает сложность: сначала оптимизируйте.
Практика
- Сделайте сервис stateless и запустите 3 реплики за балансировщиком.
- Настройте автоскейлинг по длине очереди.
- Придумайте ключ шардирования для таблицы заказов и обсудите hot shards.
Вопросы с ответами
Что значит stateless-сервис?
Не хранит состояние между запросами в памяти; состояние вынесено во внешние хранилища.
Когда шардировать БД?
Когда исчерпаны оптимизация, кэш и реплики, а нагрузка или объём превышают один узел.