HAProxyconfiguration为RabbitMQ

我有一个API发送消息到RabbitMQ。

HAProxy后面有一个高可用性的RabbitMQ集群。

当我加载testing我的API时,我开始看到很多这样的:

Recovering from a network failure... Exception in the reader loop: AMQ::Protocol::EmptyResponseError: Empty response received from the server.

在我的独angular兽的日志。

如果我通过haproxy直接连接到RabbitMQ,我不这样做。 我哪里错了,我的haproxyconfiguration如下所示:

 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 xxxx:9000 maxconn 100 check server 1-http_backend xxxx:9000 maxconn 100 check backend http_bucky_backend mode http option httpchk GET /status http-check expect string up server 0-http_bucky_backend xxxx:9000 maxconn 100 check server 1-http_bucky_backend xxxx:9000 maxconn 100 check backend rabbitmq_backend balance roundrobin mode tcp server 0-rabbitmq_backend xxxx:5672 maxconn 4000 check server 1-rabbitmq_backend xxxx:5672 maxconn 4000 check 

在负载下,负载平衡器通常为20-30%cpu

Nerijus是正确的,这个问题是由HAProxy有一个客户端超时引起的,这意味着,如果连接被认为是空闲超过X毫秒,那么连接将被丢弃。

TCP可以发送保持活动的数据包,以确保空闲的连接应该保持打开状态。

您可以使用以下命令来检查您的TCP参数是否保持活动数据包:

$ cat /proc/sys/net/ipv4/tcp_keepalive_time

默认情况下,此configuration等于7200秒,这意味着TCP只有在连接闲置超过2小时后才会开始发送保持活动数据包。

所以,只需将您的HAProxy客户端超时值更新为大于2小时的值,例如:

timeout client 3h

并将clitcpka选项添加到您的后端:

backend rabbitmq_backend balance roundrobin mode tcp option clitcpka server 0-rabbitmq_backend xxxx:5672 maxconn 4000 check server 1-rabbitmq_backend xxxx:5672 maxconn 4000 check

从默认部分提取timeout client 50s ,并移至除rabbitmq_frontend以外的所有其他timeout client 50s 。 客户端超时意味着它closuresrabbitmq客户端和haproxy之间的TCP会话,所以从这个套接字读取“”。