Ответ
Для принятия обоснованного решения о масштабировании бэкенд-сервиса (особенно написанного на Go) необходимо отслеживать несколько категорий метрик:
1. Метрики ресурсов (Resource Metrics)
Это базовые показатели здоровья системы.
- CPU Utilization (Загрузка ЦП): Если средняя загрузка процессора на всех экземплярах сервиса стабильно высокая (например, >80%), это прямой сигнал к горизонтальному масштабированию (добавлению новых экземпляров).
- Memory Usage (Использование памяти): Постоянно высокое потребление памяти может указывать на необходимость вертикального масштабирования (увеличения объема ОЗУ) или на наличие утечек памяти в приложении.
2. Метрики производительности (Performance Metrics)
Эти метрики отражают качество обслуживания пользователей.
- Latency (Время ответа): Особенно важны перцентили (p90, p95, p99). Рост времени ответа указывает на то, что система не справляется с текущей нагрузкой.
- Throughput (Пропускная способность): Измеряется в запросах в секунду (RPS/QPS). Если пропускная способность достигла плато и не растет с увеличением нагрузки, это предел текущей конфигурации.
- Error Rate (Уровень ошибок): Увеличение количества ошибок (5xx) часто коррелирует с перегрузкой сервиса.
3. Специфичные для Go и приложения метрики
- Количество горутин: Аномальный и постоянный рост числа горутин может сигнализировать об утечках (goroutine leaks), когда горутины блокируются и никогда не завершаются. Это можно отслеживать через метрику
go_goroutines
изpprof
. - Длина очередей (Queue Lengths): Если ваш сервис использует очереди (например, RabbitMQ, Kafka или внутренние каналы Go) для обработки задач, рост длины очереди — явный признак того, что обработчики (workers) не справляются с потоком задач и их количество нужно увеличить.
Пример инструментария в Go:
Для сбора этих метрик обычно используют библиотеку prometheus/client_golang
для их экспорта и систему мониторинга Prometheus для сбора и анализа.
import "github.com/prometheus/client_golang/prometheus"
var httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests",
},
[]string{"method", "path", "status_code"},
)
var httpRequestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests",
},
[]string{"method", "path"},
)
Автоматическое масштабирование (autoscaling) в облачных средах (например, Kubernetes) обычно настраивается на основе пороговых значений этих метрик (например, CPU Utilization > 80%
).