Архитектура и Highload: масштабируемость, микросервисы и производительность
С ростом приложений возникают проблемы, связанные с производительностью, масштабируемостью и поддерживаемостью.
1. Монолит vs Микросервисы
- Монолит: единое приложение, в котором вся бизнес-логика тесно связана.
- Плюсы: легко разрабатывать, тестировать и деплоить (на начальном этапе); простое горизонтальное масштабирование (дублируется всё приложение); низкая сетевая задержка (все компоненты в одном адресном пространстве).
- Минусы: сложно масштабировать отдельные части; долгие сборка/деплой; сложность кода; единая точка отказа может вывести из строя всё приложение.
- Микросервисы: подход, при котором одно приложение состоит из множества небольших, слабо связанных и независимо разворачиваемых сервисов.
- Плюсы:
- Независимое масштабирование: компоненты можно масштабировать независимо, оптимизируя использование ресурсов и затраты.
- Скорость и гибкость: проще обновлять и добавлять новую функциональность, не затрагивая всё приложение.
- Технологическая независимость: команды могут выбирать стек, наиболее подходящий для конкретной задачи каждого сервиса.
- Изоляция сбоев: проблемы в одном сервисе реже приводят к падению всей системы, обеспечивая лучшую отказоустойчивость.
- Минусы: высокая сложность эксплуатации; проблемы согласованности данных (распределённые транзакции); сетевые задержки и риски потери связности; более объёмное и сложное логирование/мониторинг.
- Плюсы:
Микросервисы vs SOA (Service-Oriented Architecture)
Оба подхода декомпозируют приложения на сервисы, но различаются масштабом и способом взаимодействия:
- SOA: корпоративная инициатива по стандартизации интеграции всех веб-сервисов в организации, часто с использованием Enterprise Service Bus (ESB).
- Микросервисы: архитектура на уровне приложения, ориентированная на маленькие, независимые сервисы, взаимодействующие через легковесные механизмы (REST, gRPC, Message Queues).
2. Стратегии масштабирования
- Вертикальное масштабирование: добавление ресурсов (CPU, RAM) на один сервер.
- Горизонтальное масштабирование: добавление серверов и распределение нагрузки (Load Balancing).
3. Масштабирование баз данных
- Разделение чтения/записи (Read/Write Splitting): одна Master-база данных (запись) и несколько Replica (чтение).
- Partitioning: разделение большой таблицы на более мелкие части в рамках одного экземпляра БД.
- Sharding: распределение данных между несколькими физическими серверами баз данных.
- Vertical Sharding: размещение разных таблиц в разных базах данных.
- Horizontal Sharding: разделение строк одной таблицы между несколькими БД на основе ключа шардирования (shard key).
4. Архитектурные паттерны
- CQRS (Command Query Responsibility Segregation): разделение моделей для записи данных (Commands) и чтения данных (Queries).
- Event Sourcing: вместо хранения текущего состояния сохраняются все изменения в виде последовательности событий.
- API Gateway: единая точка входа для всех микросервисов, отвечающая за маршрутизацию, аутентификацию и балансировку нагрузки.
- Circuit Breaker: предотвращает каскадные сбои в системе, вызванные неработающим сервисом.