Производительность
Кэширование запросов
SLOzy использует двухуровневое кэширование: in-memory (sync.Map) и Redis/PostgreSQL.
Настройки кэша
go
CacheConfig{
DefaultTTL: 300, // 5 минут
MaxEntries: 10000, // максимум записей
CleanupInterval: 60, // очистка каждые 60s
EnableMemoryCache: true, // in-memory кэш
EnableCompression: true, // сжатие больших результатов
CompressionThreshold: 1024, // сжимать результаты > 1 KB
}Стратегия кэширования
- Memory cache — первый уровень, минимальная задержка
- Database cache — второй уровень, долговременное хранение
- Warmup — предзагрузка часто используемых запросов
- Eviction — LRU при превышении
MaxEntries
Эффективность кэша отслеживается через метрики cache_hit_ratio и cache_misses_total.
Пул соединений PostgreSQL
Настройки пула в internal/db/connection.go:
go
config.MaxConns = 25 // максимум открытых соединений
config.MinConns = 10 // минимум idle соединений
config.MaxConnLifetime = 30m // переоткрытие каждые 30 минут
config.MaxConnIdleTime = 10m // закрытие неиспользуемых через 10 минут
config.HealthCheckPeriod = 1m // проверка здоровья каждую минутуРекомендации по настройке:
MaxConns = 25для стандартного продакшена- Увеличить до 50 для высоконагруженных инсталляций
MaxConnLifetimeне более 60 минут для избежания утечек- Для K8s учитывайте лимиты контейнера при расчёте пула
Token bucket rate limiting
Rate limiter реализован через token bucket алгоритм в internal/middleware/security.go:
go
rl := NewRateLimiter(rate=1000, burst=50, window=1 minute)- Глобальный лимит: 1000 запросов в минуту
- На IP: 100 запросов в минуту
- На создание SLO: 5 запросов в секунду
- Whitelist/blacklist: управление доступом по IP
Ответ при превышении лимита:
json
{
"error": "Rate limit exceeded",
"limit": 100,
"window": "1 minute",
"message": "Too many requests from your IP address"
}Lazy loading фронтенда
Фронтенд на Vite + React 19 использует lazy loading для оптимизации:
typescript
const SLODashboard = lazy(() => import('./pages/SLODashboard'))
const Analytics = lazy(() => import('./pages/Analytics'))- Код разделён по роутам (React Router)
- Chunked сборка через Vite
- Оптимизированные bundle для production
- Tree shaking через ES modules
Рекомендации
- Настройте
POSTGRES_MAX_OPEN_CONNSиPOSTGRES_MAX_IDLE_CONNSпод нагрузку - Включите
EnableMemoryCacheдля снижения нагрузки на БД - Используйте Redis как внешний кэш при нескольких репликах
- Мониторьте
cache_hit_ratio— при drop ниже 0.5 увеличьте TTL - Настройте rate limits под ваш профиль нагрузки