HAProxy vs Envoy: какой прокси выбрать для микросервисов

Два подхода к балансировке: классика vs cloud-native

Компания «ПлатёжСервис» — 50 микросервисов, 15,000 RPS на пике. Текущий стек: Nginx как reverse proxy + ручная конфигурация upstream. Проблемы: нет dynamic service discovery, health checks примитивные, нет observability из коробки.

Два кандидата на замену:

КритерийHAProxyEnvoy
Год создания20002016 (Lyft)
ЯзыкCC++
КонфигурацияФайл (haproxy.cfg)YAML + xDS API (динамическая)
L4/L7ОбаОба
HTTP/2, gRPCHTTP/2 (с 2.0)Нативно
Service discoveryDNS, Consul (через helper)xDS API (нативно)
ObservabilityStats page, PrometheusВстроенные метрики, трейсы
Горячая перезагрузкаHitless reload (2.4+)Hot restart + xDS
Потребление RAM~30 МБ~80 МБ
Latency (p99)~0.1 мс~0.3 мс

HAProxy: максимальная производительность

HAProxy — проверенный временем L4/L7 балансировщик. 25 лет в production у крупнейших компаний. Конфигурация проста и предсказуема.

# /etc/haproxy/haproxy.cfg
global
    maxconn 50000
    log /dev/log local0
    stats socket /var/run/haproxy.sock mode 660 level admin
    ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384
    ssl-default-bind-options ssl-min-ver TLSv1.2

defaults
    mode http
    timeout connect 5s
    timeout client 30s
    timeout server 30s
    option httplog
    option forwardfor
    option http-server-close

# Frontend: приём трафика
frontend api_gateway
    bind *:443 ssl crt /etc/ssl/certs/api.pem
    # Маршрутизация по path
    acl is_orders path_beg /api/orders
    acl is_payments path_beg /api/payments
    acl is_users path_beg /api/users
    use_backend orders_backend if is_orders
    use_backend payments_backend if is_payments
    use_backend users_backend if is_users
    default_backend fallback

# Backend с health checks
backend orders_backend
    balance roundrobin
    option httpchk GET /health
    http-check expect status 200
    server orders-1 10.0.1.10:8080 check inter 5s fall 3 rise 2
    server orders-2 10.0.1.11:8080 check inter 5s fall 3 rise 2
    server orders-3 10.0.1.12:8080 check inter 5s fall 3 rise 2

# Rate limiting
frontend rate_limited
    bind *:80
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
Совет: HAProxy Data Plane API позволяет менять конфигурацию через REST API без reload. Идеально для интеграции с Consul/etcd для динамического service discovery.

Envoy: cloud-native и динамическая конфигурация

Envoy — прокси, созданный для микросервисов. Главное отличие: конфигурация обновляется динамически через xDS API без перезагрузки.

# envoy.yaml — базовая конфигурация
static_resources:
  listeners:
  - name: api_listener
    address:
      socket_address: { address: 0.0.0.0, port_value: 8443 }
    filter_chains:
    - transport_socket:
        name: envoy.transport_sockets.tls
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
          common_tls_context:
            tls_certificates:
            - certificate_chain: { filename: /etc/ssl/cert.pem }
              private_key: { filename: /etc/ssl/key.pem }
      filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress
          route_config:
            virtual_hosts:
            - name: api
              domains: ["*"]
              routes:
              - match: { prefix: "/api/orders" }
                route: { cluster: orders_service }
              - match: { prefix: "/api/payments" }
                route:
                  cluster: payments_service
                  retry_policy:
                    retry_on: "5xx,connect-failure"
                    num_retries: 3

  clusters:
  - name: orders_service
    type: STRICT_DNS
    load_assignment:
      cluster_name: orders_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: orders.svc, port_value: 8080 }
    health_checks:
    - timeout: 2s
      interval: 10s
      http_health_check: { path: "/health" }
    circuit_breakers:
      thresholds:
      - max_connections: 1000
        max_requests: 2000
        max_retries: 3

Envoy предоставляет детальные метрики из коробки: latency per route, retry count, circuit breaker trips, upstream health.

Производительность: бенчмарки

Тест: 8 CPU Xeon, 32 GB RAM, wrk -t8 -c1000 -d60s, прокси к бэкенду (nginx static 1KB).

МетрикаHAProxy 2.9Envoy 1.31
RPS (HTTP/1.1)185,000142,000
RPS (HTTP/2)156,000138,000
Latency p500.08 мс0.15 мс
Latency p990.12 мс0.35 мс
RAM (idle, 50 backends)28 МБ82 МБ
RAM (under load)65 МБ180 МБ
CPU (50K RPS)1.2 cores2.1 cores

HAProxy на 25-30% быстрее и в 3x экономнее по ресурсам. Но Envoy предлагает то, чего нет у HAProxy из коробки:

  • Distributed tracing — автоматическое добавление trace headers
  • Circuit breakers — встроенные, per-cluster
  • Dynamic config via xDS — без reload, без потери соединений
  • WASM extensions — кастомные фильтры на любом языке

Рекомендации по выбору

«ПлатёжСервис» выбрал HAProxy для edge (API gateway) и Envoy как sidecar (через Istio) для inter-service коммуникации.

HAProxy — когда нужна максимальная производительность на edge, статическая конфигурация, минимальное потребление ресурсов. Envoy — когда нужна динамическая конфигурация, service mesh, distributed tracing.
СценарийРекомендация
API Gateway (edge)HAProxy — производительность, простота
Service Mesh sidecarEnvoy — динамическая конфигурация, трейсинг
L4 TCP балансировкаHAProxy — проверен десятилетиями
gRPC балансировкаEnvoy — нативная поддержка
Kubernetes IngressEnvoy (через Contour/Emissary) или HAProxy Ingress
Маленькая команда (1-5 сервисов)HAProxy — проще настроить и обслуживать
Микросервисы (20+ сервисов)Envoy (с control plane) — масштабируемость

Часто задаваемые вопросы

HAProxy Community — полностью open-source (GPLv2). HAProxy Enterprise — коммерческая версия с WAF, bot protection, расширенной аналитикой и поддержкой. Для 95% задач Community версии достаточно.

Да, конфигурация Envoy более verbose (YAML с proto3 type annotations). Простой reverse proxy на HAProxy — 20 строк, на Envoy — 60 строк. Но Envoy компенсирует это xDS API: в production конфигурация генерируется control plane (Istio, Consul Connect), не руками.

Да, HAProxy Ingress Controller — зрелый проект. Поддерживает rate limiting, WAF, SSL termination, cookie-based persistence. Альтернатива Nginx Ingress и Traefik.

xDS (x Discovery Service) — набор gRPC API для динамического управления конфигурацией Envoy: CDS (clusters), EDS (endpoints), LDS (listeners), RDS (routes). Control plane (Istio, Consul) отправляет обновления через xDS, Envoy применяет их без перезагрузки.

Да, Envoy отлично работает standalone как edge proxy или API gateway. Проект Emissary-ingress (ранее Ambassador) — это Envoy с удобным Kubernetes CRD для конфигурации. Для standalone edge без Kubernetes — HAProxy проще.

Нужна помощь с внедрением?

Настроим, оптимизируем и возьмём на поддержку вашу инфраструктуру. 15+ лет опыта, 8 серверов Dell Xeon в дата-центре МТС.

📞 Связаться с нами

Комментарии 0

Оставить комментарий

9 + 3 =