У меня есть API, который отправляет сообщения RabbitMQ.
У меня есть кластер RabbitMQ высокой доступности за HAProxy.
Когда я тестирую свой API, я начинаю видеть много такого:
Recovering from a network failure...
Exception in the reader loop: AMQ::Protocol::EmptyResponseError: Empty response received from the server.
В моем журнале единорогов.
Если я подключаюсь напрямую к RabbitMQ, как предполагается, через haproxy, я этого не сделаю. Где я ошибаюсь, моя конфигурация haproxy выглядит так:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user haproxy
group haproxy
defaults
log global
mode http
retries 3
timeout client 50s
timeout connect 10s
timeout server 50s
option dontlognull
option forwardfor
option httplog
option redispatch
balance roundrobin
# Set up application listeners here.
listen http_frontend
bind *:80
mode http
default_backend http_backend
option httpclose
reqadd X-Forwarded-Proto:\ http
listen https_frontend
bind *:443 ssl crt /etc/haproxy.pem
mode http
default_backend http_backend
reqadd X-Forwarded-Proto:\ https
listen http_bucky_frontend
bind *:1880
mode http
default_backend http_bucky_backend
option httpclose
reqadd X-Forwarded-Proto:\ http
listen https_bucky_frontend
bind *:1443 ssl crt /etc/haproxy.pem
mode http
default_backend http_bucky_backend
reqadd X-Forwarded-Proto:\ https
listen rabbitmq_frontend
bind *:5672
mode tcp
default_backend rabbitmq_backend
option tcplog
listen admin
bind 127.0.0.1:22002
mode http
stats uri /
backend http_backend
mode http
server 0-http_backend x.x.x.x:9000 maxconn 100 check
server 1-http_backend x.x.x.x:9000 maxconn 100 check
backend http_bucky_backend
mode http
option httpchk GET /status
http-check expect string up
server 0-http_bucky_backend x.x.x.x:9000 maxconn 100 check
server 1-http_bucky_backend x.x.x.x:9000 maxconn 100 check
backend rabbitmq_backend
balance roundrobin
mode tcp
server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
Под нагрузкой балансировщик нагрузки обычно составляет 20-30% процессора.
Нериюс прав, эта проблема вызвана тем, что HAProxy имеет тайм-аут клиента, что означает, что если соединение считается бездействующим более X мс, соединение разрывается.
TCP может отправлять пакеты проверки активности, чтобы гарантировать, что неактивное соединение должно оставаться открытым.
Вы можете проверить свой параметр TCP на наличие пакетов keep-alive, используя следующую команду:
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
По умолчанию эта конфигурация равна 7200 секундам, что означает, что TCP начнет отправлять пакеты проверки активности только после того, как соединение простаивает более 2 часов.
Итак, просто обновите значение тайм-аута клиента HAProxy до значения> 2 часов, например:
timeout client 3h
И добавьте параметр clitcpka в свой бэкэнд:
backend rabbitmq_backend
balance roundrobin
mode tcp
option clitcpka
server 0-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
server 1-rabbitmq_backend x.x.x.x:5672 maxconn 4000 check
удалять timeout client 50s
из раздела по умолчанию и перейти ко всем остальным, кроме rabbitmq_frontend
. Тайм-аут клиента означает, что он закрывает сеанс TCP между клиентом rabbitmq и haproxy, поэтому чтение из этого сокета получает "".