Skip to content

Производительность

Кэширование запросов

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
}

Стратегия кэширования

  1. Memory cache — первый уровень, минимальная задержка
  2. Database cache — второй уровень, долговременное хранение
  3. Warmup — предзагрузка часто используемых запросов
  4. 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 под ваш профиль нагрузки