Вопрос проверяет понимание стратегий масштабирования распределённых систем — горизонтального, вертикального, кеширования, шардинга и др.
Для масштабируемости используют горизонтальное и вертикальное масштабирование, кеширование, шардинг, разделение нагрузки, очереди сообщений, CDN и выделение независимых сервисов. Это позволяет системе выдерживать рост нагрузки, сокращать задержки и сохранять стабильность при увеличении объёма данных.
Масштабируемость — это способность системы увеличивать пропускную способность и обработку данных без деградации производительности. Современные архитектуры используют совокупность подходов, поскольку один метод редко решает проблему полностью.
Определение:
Горизонтальное масштабирование — добавление новых экземпляров одного и того же сервиса.
Используется, когда:
нагрузка растёт по количеству запросов;
система построена вокруг stateless-сервисов;
есть балансировщик нагрузки.
Преимущества:
практически неограниченный рост;
быстрое добавление мощностей;
высокая отказоустойчивость.
Обычно применяется к API-сервисам, воркерам, gateway.
Определение:
Вертикальное масштабирование — увеличение мощности одной машины (CPU, RAM).
Применяется для:
баз данных;
кластеров, требующих больших вычислительных ресурсов;
legacy-приложений.
Главный недостаток — ограниченный предел.
Кеширование снижает нагрузку на базу данных и другие ресурсы:
application-level cache (Redis, Memcached);
CDN для статики;
кеширование результатов запросов;
кеширование часто используемых данных в памяти сервисов.
Типичный путь:
клиент → CDN → API → Redis → БД.
Определение:
Шардирование — разделение данных на независимые сегменты (shards), каждый из которых хранится отдельно.
Применяется для больших таблиц и высоконагруженных систем:
social networks (пользователи по диапазонам id);
e-commerce (шарды по регионам);
аналитические системы.
Шардирование позволяет распределять нагрузку и держать базы данных лёгкими.
Репликация обеспечивает:
чтение с реплик;
распределение нагрузки;
отказоустойчивость.
Архитектура master + replicas особенно полезна для read-heavy систем.
Load balancers (Nginx, HAProxy, AWS ELB) распределяют запросы между экземплярами сервисов.
Полезные стратегии:
round robin;
least connections;
weighted routing;
health checks.
Использование message broker:
Kafka
RabbitMQ
SQS
NATS
Позволяет:
выносить работу из критического пути;
обрабатывать данные асинхронно;
сглаживать пики нагрузки.
Разделение системы на независимые сервисы повышает масштабируемость:
каждый сервис масштабируется независимо;
критические компоненты получают больше ресурсов;
легче выделять hot paths.
Содержащиеся ближе к клиенту данные:
уменьшают задержки;
снижают нагрузку на центральные сервера.
Масштабируемость достигается комбинацией горизонтального масштабирования, кеширования, шардирования, очередей сообщений, репликации, балансировки и разделения сервисов. Каждый метод решает свою часть задачи и должен применяться в зависимости от текущих bottleneck-ов.