Руководство по интеграции оптимизированных компонентов

Руководство по интеграции оптимизированных компонентов

Обзор интеграции

Проект был оптимизирован с добавлением следующих компонентов:

  1. Data Manager - управление статическими данными в памяти
  2. Circuit Breaker - защита от сбоев внешних сервисов
  3. Profiler - профилирование и мониторинг
  4. Worker Pool - управление горутинами

Архитектура интеграции

graph TB
    subgraph "ServiceContainer"
        PG[PostgresCircuitBreaker]
        CH[ClickHouseStorage]
        DM[DataManager]
        PROF[Profiler]
        CB[CircuitBreakers]
        RABBIT[RabbitMQStorage]
        HEALTH[HealthService]
    end
    
    subgraph "Внешние системы"
        POSTGRES[(Postgres)]
        CLICKHOUSE[(ClickHouse)]
        RABBITMQ[RabbitMQ]
    end
    
    subgraph "Метрики"
        PROM[Prometheus]
        PPROF[pprof]
    end
    
    PG --> POSTGRES
    CH --> CLICKHOUSE
    RABBIT --> RABBITMQ
    DM --> PG
    DM --> CH
    PROF --> PROM
    PROF --> PPROF
    CB --> PG
    CB --> RABBIT
    HEALTH --> PG
    HEALTH --> RABBIT

ServiceContainer

type ServiceContainer struct {
    // Основные сервисы
    PostgresClient *storage.PostgresCircuitBreaker
    DataManager    *data.DataManager
    Profiler       *profiling.Profiler
    CircuitBreakers map[string]*circuitbreaker.CircuitBreaker
    
    // Остальные сервисы...
}

Интерфейсы

Создан общий интерфейс model.StorageInterface для избежания циклических зависимостей:

type StorageInterface interface {
    GetQuotesForPeriod(ctx context.Context, startTime, endTime time.Time) ([]Quote, error)
    GetQuote(ctx context.Context, exchange, pair string, timestamp time.Time) (*Quote, error)
    GetHistoricalQuotes(ctx context.Context, exchange, pair string, startTime, endTime time.Time) ([]Quote, error)
    BatchSetQuotes(ctx context.Context, quotes []Quote) error
    Ping(ctx context.Context) error
    Close()
}

Жизненный цикл сервисов

sequenceDiagram
    participant Main as Main
    participant Config as Config Manager
    participant Container as ServiceContainer
    participant PG as PostgresStorage
    participant DM as DataManager
    participant Profiler as Profiler
    participant Health as HealthService
    
    Main->>Config: LoadConfig()
    Main->>Container: ColdStart()
    Container->>PG: NewPostgresStorage()
    Container->>DM: NewDataManager()
    Container->>Profiler: NewProfiler()
    Container->>Health: NewHealthService()
    
    Main->>Container: WarmStart()
    Container->>DM: LoadData(24h)
    DM->>PG: GetQuotesForPeriod()
    
    Main->>Container: HotStart()
    Container->>Profiler: Start()
    Container->>Health: Start()
    
    Main->>Container: GracefulShutdown()
    Container->>Profiler: Stop()
    Container->>Health: Stop()
    Container->>DM: Close()
    Container->>PG: Close()

1. ColdStart - Инициализация инфраструктуры

  • PostgresStorage с Circuit Breaker (основная БД)
  • ClickHouseStorage (опционально, для аналитики)
  • RabbitMQ Storage
  • Health Service
  • Circuit Breakers (Postgres, ClickHouse, RabbitMQ)
  • Data Manager
  • Profiler

2. WarmStart - Загрузка данных

  • Загрузка данных в Data Manager (24 часа)
  • Индексация для быстрого поиска

3. HotStart - Запуск бизнес-логики

  • Запуск Profiler
  • Создание AnalyticsService
  • Инициализация TaskWorker
  • Запуск Health Service

Конфигурация

Новые параметры в config.yaml:

system_setup:
  metrics_port: 8080  # Порт для метрик Prometheus
  pprof_port: 9080    # Порт для профилирования pprof
  worker_pool:
    max_workers: 10
    queue_size: 100
    task_worker:
      max_workers: 5
      queue_size: 50
      task_timeout: "30s"

storage:
  postgres:
    db_user: "quotes"
    db_password: "1qazxsw2"
    db_host: "localhost:5432"
    db_name: "quotes"
  clickhouse:
    db_user: "default"
    db_password: ""
    db_host: "localhost:9000"
    db_name: "quotes"
  rabbitmq:
    url: "amqp://user:user@localhost:5672/"

Переменные окружения:

export METRICS_PORT=8080
export PPROF_PORT=9080
export NODE_TYPE=worker
export LOG_LEVEL=info

Метрики и мониторинг

Prometheus метрики:

  • quotes_worker_* - метрики воркера
  • circuit_breaker_* - состояние circuit breakers
  • data_manager_* - статистика Data Manager
  • profiler_* - метрики профилирования

Health checks:

  • /health - общее состояние сервиса
  • /metrics - Prometheus метрики
  • /debug/pprof/* - профилирование

Circuit Breaker

Конфигурация:

  • Postgres: 5 неудач, 30с таймаут, 3 успеха для восстановления
  • ClickHouse: 5 неудач, 30с таймаут, 3 успеха для восстановления
  • RabbitMQ: 3 неудачи, 15с таймаут, 2 успеха для восстановления

Состояния:

  • Closed: Нормальная работа
  • Open: Блокировка запросов
  • Half-Open: Тестовые запросы

Data Manager

Функциональность:

  • Загрузка данных за период (по умолчанию 24 часа)
  • Индексация по времени, паре, бирже
  • Кэширование в памяти
  • Метрики производительности

API:

// Получение котировок по времени
quotes := dataManager.GetQuotesByTime(timestamp)

// Получение котировок по паре
quotes := dataManager.GetQuotesByPair(exchange, symbol)

// Получение всех данных
allQuotes := dataManager.GetAllQuotes()

Profiler

Возможности:

  • Prometheus метрики
  • pprof профилирование
  • Автоматический сбор статистики
  • Graceful shutdown

Доступные эндпоинты:

  • :8080/metrics - Prometheus метрики
  • :9080/debug/pprof/ - pprof профилирование

Graceful Shutdown

Все компоненты поддерживают graceful shutdown:

// В main.go
defer serviceContainer.Close()

// Обработка сигналов
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

<-sigChan
serviceContainer.Close()

Примеры использования

Получение статистики:

stats := serviceContainer.GetStats()
fmt.Printf("Data Manager: %+v\n", stats["data_manager"])
fmt.Printf("Circuit Breakers: %+v\n", stats["circuit_breakers"])

Использование Circuit Breaker:

cb := serviceContainer.GetCircuitBreaker("postgres")
err := cb.Execute(ctx, func() error {
    return postgresClient.SomeOperation()
})

Работа с Data Manager:

// Получение котировок за последний час
endTime := time.Now()
startTime := endTime.Add(-1 * time.Hour)
quotes := dataManager.GetQuotesForPeriod(startTime, endTime)

Мониторинг и алерты

Рекомендуемые алерты:

  1. Circuit Breaker в состоянии Open
  2. Высокое потребление памяти Data Manager
  3. Медленные запросы к БД
  4. Ошибки в TaskWorker

Grafana дашборды:

  • Общее состояние сервиса
  • Производительность Data Manager
  • Состояние Circuit Breakers
  • Метрики TaskWorker

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

Ожидаемые улучшения:

  • Data Manager: 10-100x ускорение запросов к данным
  • Circuit Breaker: Защита от каскадных сбоев
  • Worker Pool: Контролируемое использование ресурсов
  • Profiler: Детальная диагностика производительности

Мониторинг производительности:

# Метрики Prometheus
curl http://localhost:8080/metrics

# pprof профилирование
go tool pprof http://localhost:9080/debug/pprof/heap
go tool pprof http://localhost:9080/debug/pprof/profile

Troubleshooting

Частые проблемы:

  1. Circuit Breaker постоянно открыт:

    • Проверить доступность БД/RabbitMQ
    • Увеличить таймауты в конфигурации
  2. Data Manager не загружает данные:

    • Проверить логи загрузки
    • Убедиться в доступности БД
  3. Высокое потребление памяти:

    • Настроить TTL для кэша
    • Ограничить размер загружаемых данных
  4. Медленная работа:

    • Проверить метрики производительности
    • Настроить индексы в БД
    • Оптимизировать запросы

Заключение

Интеграция новых компонентов значительно улучшает:

  • Надежность: Circuit Breaker защищает от сбоев
  • Производительность: Data Manager ускоряет доступ к данным
  • Мониторинг: Profiler предоставляет детальную диагностику
  • Масштабируемость: Worker Pool контролирует ресурсы

Все компоненты работают вместе, обеспечивая стабильную и производительную работу системы.