Кратко:
о Горизонтальном маштабировании стоит задумываться на моменте проектирования программы.
Стот использовать более новые и быстрые библиотеки.
Вертикально: Более мощьный сервер и быстрое желего.
Горизонтально:
Это распаралеливание процеса на несколько серверов.
Некоторые процесов (функионал) запускать на отдельном сервере выделение например База данных для редактировани одна на все осталные использую копии базы на чтения, так как запросов на чтение болше всего.
— > Горизонтальное масштабирование (Scale Out)
Nginx, HAProxy ; Stateless (без сохранения состояния)
— > Масштабирование базы данных:
Read Replicas (Реплики на БД на чтение) ; Кеширование: Использование Redis или Memcached для хранения результатов тяжелых запросов.
https://gemini.google.com/app/c015339b6f6813b2
👨Я:
Как масштабируется архитектура монолитная?
🤖💬Gemini:
Распространено заблуждение, что масштабировать можно только микросервисы. На самом деле монолитную архитектуру можно успешно масштабировать до очень высоких нагрузок, используя несколько проверенных стратегий.
Вот основные способы масштабирования монолита:
1. Вертикальное масштабирование (Scale Up)
Это самый простой и первый шаг. Вы просто увеличиваете ресурсы сервера, на котором работает приложение:
- Увеличение CPU и RAM: Позволяет обрабатывать больше потоков и держать больше данных в памяти.
- Быстрые диски (NVMe): Ускоряют работу с файловой системой и локальными базами данных.
- Ограничение: У этого метода есть «потолок» — физический предел мощности одного сервера и резкий рост стоимости топового железа.
2. Горизонтальное масштабирование (Scale Out)
Вы запускаете несколько идентичных копий (экземпляров) вашего монолита на разных серверах.
- Балансировщик нагрузки (Load Balancer): Перед серверами ставится Nginx, HAProxy или облачный балансировщик, который распределяет входящие запросы между экземплярами.
- Stateless (без сохранения состояния): Чтобы это работало, приложение должно быть «Стейтлес-архитектура — Приложение без сохранения состояния». Сессии пользователей нельзя хранить в памяти сервера; их нужно выносить во внешнее хранилище, например, в Redis.
- Преимущества stateless-подхода:
- Масштабируемость: запросы можно направлять на любой сервер в кластере — не нужно синхронизировать состояние.
- Надежность: если сервер упадет, другой легко подхватит (нет потери сессии).
- Простота: легче разрабатывать и поддерживать.
- Преимущества stateless-подхода:
3. Масштабирование базы данных:
Часто узким местом становится не само приложение, а база данных (БД).
- Read Replicas (Реплики на чтение): Создаются копии БД. Основной сервер (Master) принимает записи, а реплики (Slaves) отдают данные на чтение. Поскольку в большинстве приложений чтений намного больше, чем записей, это сильно разгружает систему.
- Кеширование: Использование Redis или Memcached для хранения результатов тяжелых запросов.
- Тяжёлые запросы — это операции, которые занимают много времени: сложные SQL-запросы к БД, вычисления, агрегации данных, вызовы внешних API и т.д. Повторное выполнение таких запросов замедляет приложение. Кеширование — сохранение результатов этих запросов в быстром хранилище (кэше). При следующем одинаковом запросе система сначала проверяет кэш: если результат там есть и актуален — возвращает его сразу, без повторного выполнения тяжёлой операции. Redis и Memcached — популярные in-memory (в оперативной памяти) системы кэширования:
- Данные хранятся в RAM, поэтому доступ к ним в десятки-сотни раз быстрее, чем к диску или БД.
- Они работают как ключ-значение: ключ — уникальный идентификатор запроса (например, хэш от параметров), значение — готовый результат (JSON, строка, объект).
- Как это работает схематично:
- Приложение получает запрос от пользователя.
- Проверяет кэш (Redis/Memcached) по ключу.
- Если hit (есть в кэше) — возвращает данные мгновенно.
- Если miss (нет) — выполняет тяжёлый запрос, сохраняет результат в кэш с TTL (временем жизни, чтобы данные не устаревали), и возвращает пользователю.
- Тяжёлые запросы — это операции, которые занимают много времени: сложные SQL-запросы к БД, вычисления, агрегации данных, вызовы внешних API и т.д. Повторное выполнение таких запросов замедляет приложение. Кеширование — сохранение результатов этих запросов в быстром хранилище (кэше). При следующем одинаковом запросе система сначала проверяет кэш: если результат там есть и актуален — возвращает его сразу, без повторного выполнения тяжёлой операции. Redis и Memcached — популярные in-memory (в оперативной памяти) системы кэширования:
- Шардирование (Sharding): Разделение данных по разным физическим базам (например, пользователи из Европы на одном сервере, из Азии — на другом).
4. Функциональное разделение (Z-Axis Scaling)
Хотя код остается монолитным, вы можете настроить балансировщик так, чтобы он направлял определенные типы запросов на выделенные группы серверов.
- Например, все запросы к
/api/reports(тяжелые отчеты) уходят на одну группу серверов, а запросы к/api/orders— на другую. Это позволяет выделять больше ресурсов под самые нагруженные части системы, не переписывая её на микросервисы.
5. Асинхронность и очереди задач
Вынос тяжелых операций из основного цикла «запрос-ответ».
- Вместо того чтобы заставлять пользователя ждать, пока генерируется PDF или отправляется письмо, приложение кидает задачу в очередь (RabbitMQ, Kafka). Отдельный процесс (Worker), который может работать на другом сервере, забирает задачу и выполняет её.
Резюме по выбору стратегии:
| Метод | Сложность | Эффект |
| Vertical | Низкая | Быстрый прирост на старте |
| Horizontal | Средняя | Почти бесконечный рост приложения |
| Replicas | Средняя | Решение проблем с БД на чтение |
| Queues | Высокая | Плавность работы и отзывчивость UI |
Хотите, чтобы я подробнее разобрал, как подготовить код монолита (сделать его Stateless) для горизонтального масштабирования?