klg-asutk-app/docs/SCALABILITY.md
Yuriy 0150aba4f5 Consolidation: KLG ASUTK + PAPA integration
- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites)
- Remove localhost refs: openapi, inbox page
- Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI
- Add stub routes: knowledge/insights, recommendations, search, log-error
- Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests
- Fix inbox-server: ORDER BY created_at, package.json
- Remove redundant app/api/inbox/files route (rewrites handle it)
- knowledge/ in gitignore (large PDFs)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 17:18:31 +03:00

345 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Документация по масштабированию
## Архитектура базы данных
### PostgreSQL
Система использует PostgreSQL для хранения данных.
#### Схема базы данных
Схема находится в `lib/database/schema.sql` и включает:
- **Нормализованные таблицы** с правильными связями
- **Индексы** на часто запрашиваемые поля
- **Партиционирование** для больших таблиц (audit_log)
- **Триггеры** для автоматического обновления `updated_at`
- **Представления** для удобных запросов
#### Индексы
Созданы индексы для:
- Поиска по регистрационным номерам (B-tree)
- Полнотекстового поиска (GIN с pg_trgm)
- Фильтрации по статусам
- Связей между таблицами (foreign keys)
#### Партиционирование
Таблица `audit_log` партиционирована по месяцам для оптимизации:
- Быстрый доступ к недавним данным
- Легкое удаление старых данных
- Улучшенная производительность запросов
#### Read Replicas
Для масштабирования чтения рекомендуется настроить read replicas:
```sql
-- Настройка на master
ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = 3;
ALTER SYSTEM SET hot_standby = on;
```
### Миграции
Используйте инструменты для миграций:
- `node-pg-migrate`
- `knex.js`
- `TypeORM`
Пример:
```bash
npm install -g node-pg-migrate
pg-migrate create initial-schema
pg-migrate up
```
---
## Кэширование
### Redis
Система использует Redis для кэширования данных.
#### Настройка
```env
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your-password
REDIS_DB=0
```
#### Использование
```typescript
import { getCache, setCache, invalidateResourceCache } from '@/lib/cache/redis';
// Получение из кэша
const aircraft = await getCache<Aircraft[]>('aircraft:all');
// Сохранение в кэш
await setCache('aircraft:all', aircraft, 300); // TTL 5 минут
// Инвалидация
await invalidateResourceCache('aircraft', 'aircraft-id');
```
#### TTL для разных типов данных
- ВС: 5 минут
- Риски: 3 минуты
- Организации: 10 минут
- Аудиты: 5 минут
- Нормативные документы: 1 час
- Статистика: 1 минута
#### Кэширование с тегами
Для групповой инвалидации:
```typescript
import { setCacheWithTags, invalidateByTags } from '@/lib/cache/redis';
await setCacheWithTags('key', data, ['aircraft', 'stats'], 300);
await invalidateByTags(['aircraft']); // Инвалидирует все с тегом 'aircraft'
```
---
## Микросервисная архитектура
### Структура сервисов
Система может быть разделена на следующие микросервисы:
1. **Auth Service** (порт 3001) - Аутентификация и авторизация
2. **Aircraft Service** (порт 3002) - Управление ВС
3. **Documents Service** (порт 3003) - Управление документами
4. **AI Agent Service** (порт 3004) - ИИ агент
5. **Notifications Service** (порт 3005) - Уведомления
6. **Audit Service** (порт 3006) - Аудит и логирование
### Конфигурация
```env
AUTH_SERVICE_URL=http://localhost:3001
AIRCRAFT_SERVICE_URL=http://localhost:3002
DOCUMENTS_SERVICE_URL=http://localhost:3003
AI_AGENT_SERVICE_URL=http://localhost:3004
NOTIFICATIONS_SERVICE_URL=http://localhost:3005
AUDIT_SERVICE_URL=http://localhost:3006
```
### Использование
```typescript
import { serviceClients } from '@/lib/microservices/service-client';
// Вызов сервиса
const aircraft = await serviceClients[ServiceType.AIRCRAFT].get('/aircraft');
// Проверка здоровья
const health = await checkServicesHealth();
```
### API Gateway
В production рекомендуется использовать API Gateway:
- **Kong** - Open source API Gateway
- **AWS API Gateway** - Managed service
- **NGINX** - Reverse proxy с дополнительными функциями
Пример конфигурации Kong:
```yaml
services:
- name: aircraft-service
url: http://aircraft-service:3002
routes:
- name: aircraft-route
paths:
- /api/aircraft
```
### Message Queue
Для асинхронных задач рекомендуется использовать:
- **RabbitMQ** - Надежная очередь сообщений
- **Apache Kafka** - Для потоковой обработки
- **Redis Pub/Sub** - Простое решение для начала
Пример с Redis:
```typescript
import { redis } from '@/lib/cache/redis';
// Публикация
await redis.publish('notifications', JSON.stringify({ type: 'risk', data }));
// Подписка
const subscriber = redis.duplicate();
await subscriber.subscribe('notifications');
subscriber.on('message', (channel, message) => {
const data = JSON.parse(message);
// Обработка
});
```
---
## Оптимизация API
### Batch запросы
Система поддерживает batch запросы для получения нескольких ресурсов за один запрос:
```typescript
// Запрос
POST /api/batch
{
"requests": [
{ "method": "GET", "path": "/aircraft" },
{ "method": "GET", "path": "/risks" },
{ "method": "GET", "path": "/organizations" }
]
}
// Ответ
{
"results": [
{ "status": 200, "body": [...] },
{ "status": 200, "body": [...] },
{ "status": 200, "body": [...] }
],
"count": 3
}
```
### Компрессия
Next.js автоматически сжимает ответы с помощью gzip/brotli.
Для дополнительной оптимизации можно использовать middleware:
```typescript
import compression from 'compression';
export function middleware(request: NextRequest) {
// Компрессия уже включена в Next.js
// Дополнительные настройки в next.config.js
}
```
### HTTP/2
HTTP/2 включен автоматически при использовании HTTPS.
Преимущества:
- Мультиплексирование запросов
- Server push (опционально)
- Сжатие заголовков
### CDN
Для статических ресурсов рекомендуется использовать CDN:
- **Vercel** - Автоматический CDN
- **Cloudflare** - Глобальный CDN
- **AWS CloudFront** - Managed CDN
Настройка в `next.config.js`:
```javascript
module.exports = {
assetPrefix: process.env.CDN_URL || '',
}
```
---
## Мониторинг производительности
### Метрики для отслеживания
1. **Время ответа API** - должно быть < 200ms для большинства запросов
2. **Использование памяти** - мониторинг утечек
3. **Использование CPU** - оптимизация тяжелых операций
4. **Размер базы данных** - планирование партиционирования
5. **Hit rate кэша** - должно быть > 80%
### Инструменты
- **Prometheus + Grafana** - Метрики и визуализация
- **New Relic** - APM (Application Performance Monitoring)
- **Datadog** - Полный мониторинг стека
- **Sentry** - Отслеживание ошибок
---
## Горизонтальное масштабирование
### Load Balancing
Используйте load balancer для распределения нагрузки:
```nginx
upstream klg_app {
least_conn;
server app1:3000;
server app2:3000;
server app3:3000;
}
server {
listen 80;
location / {
proxy_pass http://klg_app;
}
}
```
### Auto Scaling
Настройте auto scaling на основе:
- CPU utilization
- Memory usage
- Request rate
- Queue length
Пример для Kubernetes:
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: klg-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: klg-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
```
---
## Рекомендации
1. **Начните с монолита** - Разделяйте на микросервисы только при необходимости
2. **Используйте кэширование** - Это самое простое улучшение производительности
3. **Мониторьте метрики** - Нельзя оптимизировать то, что не измеряется
4. **Тестируйте под нагрузкой** - Используйте нагрузочное тестирование
5. **Планируйте партиционирование** - Заранее для больших таблиц
---
**Дата создания:** 2025-01-21
**Версия:** 1.0