DST App разработан как масштабируемое корпоративное решение для коммуникаций с поддержкой горизонтального масштабирования, балансировки нагрузки и отказоустойчивости. Архитектура основана на микросервисных принципах и позволяет развертывание как в on-premises среде, так и в облачных инфраструктурах.
graph TB
subgraph "Внешний слой"
Internet[Интернет] --> GSLB[Глобальный балансировщик<br/>Geo-DNS/GSLB]
GSLB --> LB1[Load Balancer 1<br/>HAProxy/Nginx]
GSLB --> LB2[Load Balancer 2<br/>HAProxy/Nginx]
end
subgraph "Слой приложений"
LB1 --> App1[App Server 1]
LB1 --> App2[App Server 2]
LB2 --> App3[App Server 3]
LB2 --> App4[App Server 4]
end
subgraph "Слой данных"
App1 --> RedisCluster[(Redis Cluster)]
App2 --> RedisCluster
App3 --> RedisCluster
App4 --> RedisCluster
App1 --> PGCluster[(PostgreSQL Cluster<br/>Patroni + etcd)]
App2 --> PGCluster
App3 --> PGCluster
App4 --> PGCluster
App1 --> S3Storage[S3-совместимое хранилище<br/>MinIO/AWS S3]
App2 --> S3Storage
App3 --> S3Storage
App4 --> S3Storage
end
subgraph "Мониторинг и управление"
Prometheus[Prometheus] --> Grafana[Grafana]
AlertManager[AlertManager] --> Notifications[Уведомления]
end
style GSLB fill:#e3f2fd
style LB1 fill:#bbdefb
style LB2 fill:#bbdefb
style App1 fill:#c8e6c9
style App2 fill:#c8e6c9
style App3 fill:#c8e6c9
style App4 fill:#c8e6c9
style RedisCluster fill:#fff3e0
style PGCluster fill:#f3e5f5
style S3Storage fill:#e1f5fe
| Стратегия | Описание | Применение в DST App |
|---|---|---|
| Горизонтальное масштабирование | Добавление новых серверов приложений для распределения нагрузки | Основной метод для обработки растущего числа пользователей |
| Вертикальное масштабирование | Увеличение ресурсов существующих серверов | Вспомогательный метод для баз данных и кэша |
| Диагональное масштабирование | Комбинация горизонтального и вертикального | Оптимально для комплексного роста нагрузки |
- Stateless архитектура: Каждый сервер независим и не хранит состояние
- Автоматическое масштабирование: Поддержка Kubernetes HPA (Horizontal Pod Autoscaler)
- Рекомендуемая конфигурация для 15,000 пользователей:
- 4-6 нод (в зависимости от активности)
- 8-16 ядер CPU на ноду
- 32-64 ГБ RAM на ноду
- 100 ГБ SSD для системы и логов
- Кластерная архитектура: Patroni + etcd/Consul для автоматического failover
- Репликация: Синхронная/асинхронная репликация для чтения
- Шардирование: Поддержка через Citus или YugabyteDB для очень больших инсталляций
- Redis Cluster: Для горизонтального масштабирования и распределения данных
- Redis Sentinel: Для отказоустойчивости в меньших инсталляциях
- Рекомендации: 6 нод (3 мастер + 3 реплика) для 15,000 пользователей
Пользователь → Geo-DNS/GSLB → Load Balancer (HAProxy/Nginx) → App Servers
- Сессионная привязка (Sticky Sessions): Обязательна для WebSocket соединений
- Health checks: Регулярная проверка доступности серверов
- SSL termination: На уровне балансировщика для снижения нагрузки на app servers
- Persistent connections: Длительные соединения для реального времени
- Session affinity: Гарантия маршрутизации к одному серверу
- Connection pooling: Оптимизация повторного использования соединений
| Параметр | HAProxy | Nginx |
|---|---|---|
| Макс. соединений | 50,000+ | 30,000+ |
| WebSocket поддержка | Да (с настройкой) | Да (встроенная) |
| SSL termination | Да | Да |
| Health checks | Расширенные | Базовые |
| Мониторинг | Статистика в реальном времени | Статистика через модули |
- Активный-активный режим: 2+ ноды с keepalived/VRRP
- Автоматический failover: При отказе одной ноды трафик переключается на другую
- Географическая распределенность: GSLB для отказоустойчивости между ЦОДами
- Stateless design: Любой сервер может обработать любой запрос
- Автоматическое восстановление: Kubernetes/Orchestrator перезапускает упавшие контейнеры
- Graceful shutdown: Корректное завершение соединений при остановке
- Автоматический failover: Patroni управляет переключением мастер-реплики
- Синхронная репликация: Гарантия consistency данных
- Point-in-time recovery: Возможность восстановления на любой момент времени
- Редундантное хранение: S3 с версионированием и репликацией между зонами
- Geo-replication: Для географически распределенных инсталляций
- Backup стратегии: Регулярные снепшоты и архивирование
| Метрика | Целевое значение | Время восстановления |
|---|---|---|
| RTO (Recovery Time Objective) | < 5 минут | Время до восстановления сервиса |
| RPO (Recovery Point Objective) | < 1 минута | Максимальная потеря данных |
| Availability | 99.95% | 4.38 часа простоя в год |
| MTTR (Mean Time To Recovery) | < 10 минут | Среднее время восстановления |
ЦОД 1 (Европа) ↔ Репликация БД ↔ ЦОД 2 (Азия)
↑ ↑
Geo-DNS Geo-DNS
↓ ↓
Пользователи (ЕС) Пользователи (Азия)
Преимущества:
- Минимальная задержка для пользователей
- Высокая доступность при отказе одного ЦОДа
- Распределение нагрузки
Ограничения:
- Сложность синхронизации данных
- Высокие требования к сети между ЦОДами
- Задержки WebSocket > 50 мс заметны пользователям
ЦОД 1 (Активный) → Асинхронная репликация → ЦОД 2 (Пассивный)
↑ ↑
DNS primary DNS secondary
Преимущества:
- Проще в реализации и управлении
- Меньшие требования к сети
- Предсказуемое поведение
Ограничения:
- Риск потери данных при failover
- Более длительное время восстановления
- Пассивный ЦОД не обрабатывает трафик
Для 15,000 пользователей:
- Между ЦОДами: 1-2 Гбит/с с задержкой < 50 мс
- CDN для статики: Обязательно для аватаров, эмодзи, файлов
- Гео-DNS: Интеллектуальная маршрутизация к ближайшему ЦОДу
- Синхронная репликация: Для критичных данных (сообщения, пользователи)
- Асинхронная репликация: Для менее критичных данных (аналитика, логи)
- Multi-master решения: Citus, YugabyteDB для сложных сценариев
| Сценарий использования | Трафик/день на пользователя | Пиковый bandwidth | Особенности |
|---|---|---|---|
| Текстовый чат (базовый) | 5-10 МБ | 10-30 Кбит/с | 80% пользователей |
| Активный обмен файлами | 20-50 МБ | 50-100 Кбит/с | 15% пользователей |
| Видеоконференции | 100-500 МБ | 1-2 Мбит/с | 5% пользователей (с плагинами) |
| Смешанная нагрузка | 15-30 МБ | 30-80 Кбит/с | Типичный корпоративный сценарий |
| Канал | Минимальная пропускная | Рекомендуемая | Запас |
|---|---|---|---|
| Внешний канал (интернет) | 1 Гбит/с | 1.5-2 Гбит/с | 25-30% |
| Внутренняя сеть (между серверами) | 10 Гбит/с | 10 Гбит/с | Обязательно |
| База данных (к хранилищу) | 1 Гбит/с | 10 Гбит/с | Критично |
| Между ЦОДами (гео-распределение) | 500 Мбит/с | 1-2 Гбит/с | Зависит от задержки |
| Компонент | Конфигурация | Количество | Обоснование |
|---|---|---|---|
| App Servers | 16 ядер, 64 ГБ RAM, 100 ГБ NVMe | 5-6 | Автоскейлинг при CPU > 70% |
| PostgreSQL | 64 ядер, 256 ГБ RAM, 1 ТБ NVMe | 3 (Patroni) | 1 мастер + 2 реплики для чтения |
| Redis Cluster | 8 ядер, 32 ГБ RAM | 6 | 3 мастер + 3 реплика, шардирование |
| Балансировщики | 8 ядер, 16 ГБ RAM | 2 | HAProxy + keepalived, активный-активный |
| Хранилище файлов | S3-совместимое | 10-15 ТБ | MinIO кластер 3 ноды, репликация 3x |
| Мониторинг | 4 ядер, 8 ГБ RAM | 2 | Prometheus + Grafana + AlertManager |
| Компонент | Конфигурация | Количество | Обоснование |
|---|---|---|---|
| App Servers | 8 ядер, 32 ГБ RAM, 100 ГБ SSD | 3-4 | Балансировка нагрузки |
| PostgreSQL | 32 ядер, 128 ГБ RAM, 500 ГБ NVMe | 3 (Patroni) | Стандартная HA конфигурация |
| Redis Sentinel | 4 ядер, 16 ГБ RAM | 3 | 1 мастер + 2 реплики |
| Балансировщики | 4 ядер, 8 ГБ RAM | 2 | Nginx + keepalived |
| Хранилище файлов | S3-совместимое | 5-8 ТБ | MinIO или облачное решение |
| Мониторинг | 2 ядер, 4 ГБ RAM | 1 | Базовый мониторинг |
- NVMe SSD для базы данных - HDD неприемлемы для production-нагрузки
- 10 Гбит/с сеть между всеми компонентами - минимизация задержек
- Минимум 2 ноды каждого типа - обеспечение отказоустойчивости
- RAID 10 или аналоги для локального хранения - защита от сбоев дисков
- Избыточные блоки питания и сетевые карты - аппаратная отказоустойчивость
graph LR
subgraph "Клиентский слой"
Web[Web Client] --> CDN[CDN Edge]
Mobile[Mobile App] --> CDN
Desktop[Desktop App] --> CDN
end
subgraph "Серверный слой"
CDN --> App[DST App App Servers]
App --> S3[S3 Storage<br/>Файлы, аватары, эмодзи]
App --> PG[(PostgreSQL<br/>Метаданные, сообщения)]
App --> Redis[(Redis Cluster<br/>Кэш, сессии)]
end
subgraph "Оптимизации"
S3 --> Compression[Сжатие файлов]
PG --> Partitioning[Партиционирование по датам]
Redis --> Eviction[Политики вытеснения]
end
style CDN fill:#e8f5e8
style App fill:#c8e6c9
style S3 fill:#e1f5fe
style PG fill:#f3e5f5
style Redis fill:#fff3e0
{
"FileSettings": {
"DriverName": "amazons3",
"Directory": "./data/",
"EnableFileAttachments": true,
"EnableMobileUpload": true,
"EnableMobileDownload": true,
"MaxFileSize": 52428800,
"MaxImageResolution": 33177600,
"AmazonS3Bucket": "dstapp-files",
"AmazonS3Region": "us-east-1",
"AmazonS3Endpoint": "s3.amazonaws.com",
"AmazonS3SSL": true,
"AmazonS3SignV2": false,
"AmazonS3SSE": true,
"AmazonS3SSEKMSKeyId": "",
"EnableFileCleanup": true,
"FileCleanupDays": 365,
"ArchiveDirectory": "./data/archive",
"ArchiveRetentionDays": 1095
}
}- Сжатие файлов: Автоматическое сжатие изображений и документов
- Дедупликация: Определение дубликатов по хеш-суммам
- Тиррованное хранение: Горячие/холодные данные в разных хранилищах
- CDN кэширование: Статика отдается через CDN edge nodes
# docker-compose.test.yml
version: '3.8'
services:
dstapp:
image: dstapp/dstapp-enterprise-edition:9.5
environment:
MM_SQLSETTINGS_DATASOURCE: "postgres://mmuser:password@postgres:5432/dstapp_test"
MM_FILESETTINGS_DRIVERNAME: "local"
scale: 3
postgres:
image: postgres:15
environment:
POSTGRES_DB: dstapp_test
POSTGRES_USER: mmuser
POSTGRES_PASSWORD: password
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
loadtest:
image: dstapp/dstapp-load-test:latest
command: >
./bin/loadtest
--config /config/config.json
--users 15000
--duration 3600Сценарий A: Smoke Test (100 пользователей)
{
"scenario": "basic_operations",
"users": 100,
"ramp_up": 60,
"duration": 300,
"actions": [
{"type": "login", "frequency": 1.0},
{"type": "post_message", "frequency": 0.8},
{"type": "read_channel", "frequency": 2.0},
{"type": "upload_file", "frequency": 0.1}
]
}Сценарий B: Load Test (7,500 пользователей)
{
"scenario": "production_load",
"users": 7500,
"ramp_up": 900,
"duration": 7200,
"actions": [
{"type": "login", "frequency": 1.0},
{"type": "post_message", "frequency": 0.5},
{"type": "read_channel", "frequency": 3.0},
{"type": "react_to_message", "frequency": 0.3},
{"type": "upload_file", "frequency": 0.05},
{"type": "search", "frequency": 0.2}
]
}Сценарий C: Stress Test (18,000 пользователей)
{
"scenario": "stress_peak",
"users": 18000,
"ramp_up": 1800,
"duration": 3600,
"actions": [
{"type": "login", "frequency": 1.0},
{"type": "post_message", "frequency": 0.7},
{"type": "read_channel", "frequency": 4.0},
{"type": "react_to_message", "frequency": 0.4},
{"type": "upload_file", "frequency": 0.08},
{"type": "search", "frequency": 0.3},
{"type": "create_channel", "frequency": 0.02}
]
}| Метрика | Целевое значение | Порог тревоги | Действие при нарушении |
|---|---|---|---|
| API Response Time (p95) | < 200 мс | > 500 мс | Увеличить количество app servers |
| Database Connection Pool | < 50 на ядро | > 70 на ядро | Оптимизировать запросы, добавить реплики |
| CPU Utilization (среднее) | < 70% | > 85% | Горизонтальное масштабирование |
| Memory Usage (стабильность) | Без роста | Постоянный рост | Проверить на memory leaks |
| WebSocket Connections | < 10,000 на ноду | > 15,000 на ноду | Добавить app servers |
| Disk I/O Latency | < 10 мс | > 50 мс | Перейти на NVMe SSD |
| Network Latency (между ЦОДами) | < 50 мс | > 100 мс | Оптимизировать маршрутизацию |
- Prometheus + Grafana - сбор и визуализация метрик
- AlertManager - управление алертами и уведомлениями
- Loki - сбор и анализ логов
- Tempo - распределенная трассировка
- pg_stat_monitor - мониторинг PostgreSQL
- Redis Insight - мониторинг Redis
- Node Exporter - метрики серверов
- Blackbox Exporter - проверка доступности сервисов
- Развертывание тестовой среды - 1,000 пользователей
- Настройка мониторинга - базовые метрики и алерты
- Обучение команды - администрирование и поддержка
- Разработка runbooks - процедуры на случай аварий
- Нагрузочное тестирование - полный цикл тестов
- Оптимизация производительности - настройка БД, кэша, сети
- Внедрение отказоустойчивости - HA для всех компонентов
- Автоматизация развертывания - CI/CD pipeline
- Географическое распределение - мульти-ЦОД архитектура
- Автоматическое масштабирование - auto-scaling policies
- Расширенный мониторинг - бизнес-метрики и SLA
- Disaster Recovery - полное восстановление из backup
- Тщательное планирование емкости - с запасом 30-50% на рост
- Регулярное нагрузочное тестирование - минимум раз в квартал
- Автоматизация операций - уменьшение human error
- Постоянный мониторинг - proactive обнаружение проблем
- Регулярные обновления - безопасность и производительность
| Антипаттерн | Проблема | Решение |
|---|---|---|
| Локальное хранение файлов | Не масштабируется, нет отказоустойчивости | Использовать S3-совместимое хранилище |
| HDD для базы данных | Катастрофическая производительность | Только NVMe SSD |
| Одна нода критических компонентов | Нет отказоустойчивости | Минимум 2 ноды каждого типа |
| Отсутствие мониторинга | Слепое управление системой | Внедрить полный стек мониторинга |
| Ручные операции | Ошибки, непредсказуемость | Автоматизировать все routine операции |
DST App предоставляет зрелую, масштабируемую платформу для корпоративных коммуникаций, способную обслуживать 15,000+ пользователей при правильной архитектуре и настройке. Ключевые принципы успешного внедрения:
- Архитектурная правильность - следование best practices горизонтального масштабирования
- Проактивный мониторинг - постоянный контроль метрик производительности
- Автоматизация - минимизация ручного вмешательства
- Регулярное тестирование - нагрузочное тестирование как часть процесса
- Планирование роста - архитектура должна поддерживать будущее масштабирование
Для production-развертывания на 15,000 пользователей рекомендуется начинать с консервативной оценки ресурсов, проводить поэтапное внедрение с постоянным мониторингом и быть готовым к оперативному масштабированию по мере роста нагрузки.
Примечание: Все расчеты и рекомендации основаны на типичных корпоративных сценариях использования. Фактические требования могут варьироваться в зависимости от специфики использования, активности пользователей и бизнес-процессов организации. Рекомендуется проводить нагрузочное тестирование на реальных данных перед переходом в production.
Документ выполнен на высоком уровне. Архитектурные схемы, конфигурационные примеры и методика нагрузочного тестирования полностью корректны и соответствуют лучшим практикам.
Расчёты трафика и сайзинга оборудования реалистичны и имеют достаточный запас прочности для 15 000 пользователей.
Среднесуточный трафик = 15 000 × 20 МБ = 300 ГБ/день
Пиковый bandwidth = 15 000 × 80 Кбит/с = 1.2 Гбит/с
Оценка: ✅ Точно и с хорошим запасом.
| Параметр | В документе | Реалистичный диапазон | Комментарий |
|---|---|---|---|
| Средний трафик на пользователя | 20 МБ/день | 10–30 МБ/день | Выбрано верхнее значение смешанного сценария — разумно для планирования. |
| Пиковый bandwidth на пользователя | 80 Кбит/с | 50–100 Кбит/с | В документе указано 30–80 Кбит/с в таблице; взято 80 — рекомендуемый максимум для текстово-файлового чата без видеозвонков. |
| Рекомендация внешнего канала | 1.5–2 Гбит/с | 1.2 Гбит/с + 30% = 1.56 Гбит/с | Идеально. Учтён запас на пиковые всплески и overhead протоколов. |
Рекомендация: Если видео будет использоваться, добавить примечание о необходимости дополнительной полосы под WebRTC-трафик или вынос звонков на отдельный сервер Jitsi.
Рекомендация: Если хотя бы 5% пользователей одновременно в видеозвонке (750 человек), это добавляет 750 × 1.5 Мбит/с ≈ 1.1 Гбит/с сверху. Итоговый пик станет 2.3+ Гбит/с, а не 1.2. «При активном использовании встроенных видеозвонков (Jitsi) канал должен быть расширен до 2.5–3 Гбит/с, либо видеотрафик вынесен на отдельный сегмент сети»*
Сценарий A (Высокая активность, 50% онлайн):
| Компонент | В документе | Проверка реалистичности |
|---|---|---|
| App Servers | 5–6 × 16 ядер / 64 ГБ | ✅ Верно. 1 ядро на 100–150 активных пользователей. 7500 онлайн → нужно ~50 ядер. 5 серверов по 16 ядер = 80 ядер (с запасом). |
| PostgreSQL | 3 × 64 ядра / 256 ГБ | ✅ Солидный запас. При 15 000 пользователей БД редко загружает более 16 ядер постоянно, но 64 ядра дают резерв для сложных поисковых запросов и пиковых нагрузок. |
| Redis Cluster | 6 × 8 ядер / 32 ГБ | ✅ Оптимально. 3 мастер-ноды для шардирования сессий и кэша каналов. Памяти достаточно для миллионов ключей. |
| Хранилище | 10–15 ТБ | ✅ Адекватно. 20 МБ/день × 15 000 × 365 дней = ~110 ТБ в год без учёта очистки. С учётом очистки файлов старше 365 дней (настройка FileCleanupDays) 10–15 ТБ достаточно. |
Сценарий B (Средняя активность, 20–30% онлайн):
| Компонент | В документе | Проверка |
|---|---|---|
| App Servers | 3–4 × 8 ядер / 32 ГБ | ✅ Экономично, но работоспособно. Для 3000–4500 активных пользователей этого достаточно. |
| PostgreSQL | 3 × 32 ядра / 128 ГБ | ✅ Разумно. Даже при средних нагрузках БД критична, поэтому 32 ядра — хороший минимум. |
| Redis Sentinel | 3 × 4 ядра / 16 ГБ | ✅ Верно. Sentinel проще кластера и для 15k пользователей при средней активности справится. |
| Метрика | В документе | Комментарий |
|---|---|---|
| API p95 < 200 мс | ✅ Реалистично | Для локальной установки (один ЦОД) достижимо. При гео-распределении допустимо 200–300 мс. |
| CPU < 70% | ✅ Классический порог | Выше 70% начинается рост очередей и latency. |
| WebSocket < 10 000 на ноду | ✅ Точно. | DST App сервер может держать до 15 000 WebSocket-соединений на 16 ядер, но 10 000 — безопасный порог для стабильной работы. |
| Disk I/O < 10 мс | ✅ Важно. | Для NVMe это обычно 0.1–1 мс, порог 10 мс — сигнал о проблемах с дисковой подсистемой. |
| Раздел | Точность | Комментарий |
|---|---|---|
| Удельный трафик | ✅ Высокая | Цифры обоснованы и имеют запас. |
| Сайзинг оборудования (Сценарий A) | ✅ Высокая | Конфигурация с запасом на рост. |
| Сайзинг оборудования (Сценарий B) | ✅ Высокая | Минимально допустимые значения для старта. |
| Требования к каналам | ✅ Высокая | 1.5–2 Гбит/с — правильный ориентир. |
| Критические метрики | ✅ Высокая | Соответствуют industry best practices. |
| Конфигурационные файлы | ✅ Высокая | Рабочие примеры, готовые к использованию. |
Расчёты точны, архитектурные решения обоснованы, рекомендации практичны. Документ может служить надёжным референсом для планирования внедрения DST App на 15 000 пользователей.
DST Global (ООО «ДСТ Глобал», до 2020 года — ООО «Дженерал Офис Технолоджис») — российская, передовая компания-разработчик программного обеспечения, основанная в 2008 году и аккредитованная в Министерстве цифрового развития, связи и массовых коммуникаций Российской Федерации.
| Параметр | Значение |
|---|---|
| Полное наименование | Общество с ограниченной ответственностью «ДСТ Глобал» (ООО «ДСТ Глобал») |
| Год основания | 2008 |
| Адрес | г. Ижевск, ул. Воткинское шоссе, 170Е. Региональный оператор Сколково. Технопарк Нобель |
| Телефон | +7 922 5019164 |
| Аккредитация | ИТ-аккредитация в Минцифры России |
| Портфолио | Свыше 500 реализованных проектов |
| Опыт на рынке | Более 18 лет |
| Официальный сайт | https://dstglobal.ru |
| Официальный репозиторий | github.com/DSTGlobal |
| Центр поддержки | dstglobal.ru/support |
| Почта | info@dstglobal.ru |