HAProxy + RabbitMQ, mantenha as conexões vivas

2

Estou tentando configurar o HAProxy como um balanceador de carga em um cluster RabbitMQ. Eu uso uma configuração como esta:

global
    log /dev/log    local0 debug
    log /dev/log    local1 debug
    chroot /var/lib/haproxy
    user haproxy
    group haproxy

defaults
    log     global
    retries 2
    timeout connect 5000
    timeout server 50000
    timeout client 50000

listen rabbitmq-cluster
    bind my.pu.blic.ip:5672
    mode tcp
    option tcpka
    option redispatch
    balance roundrobin
    server rabbit1 rabbit1:5672 check inter 5000 downinter 500
    server rabbit2 rabbit2:5672 check inter 5000 downinter 500
    server rabbit3 rabbit3:5672 check inter 5000 downinter 500

Meu problema é que os clientes que devem manter conexões com um servidor rabbitmq aberto têm sua conexão fechada a cada 50 s. Existe uma opção que eu esqueci, ou devo apenas aumentar o tempo limite para algum valor mais alto para atenuar esse problema?

Obrigado!

    
por axelcdv 30.10.2014 / 19:12

1 resposta

3

Parece que seus clientes estabelecem conexão, mas após o handshake AMQP não há outra atividade (o caso comum é quando os consumidores estão aguardando dados da fila, mas da fila vazia).

A partir da configuração que você postou, o tempo limite foi definido para 50 segundos, portanto, conexões fechadas após 50 segundos são esperadas quando não há atividade de rede nessa conexão.

Para lidar com isso, você pode aumentar o tempo limite para o valor do seu caso de uso ou ativar a pulsação (consulte a seção do Hearbeat) Além disso, consulte o manual Configuração (consulte a descrição da opção hearbeat ). No seu caso, você precisa alterar o valor de heartbeat para algo menor que 50 segundos, digamos timeout / 3 arredondado para ... digamos 15.

Normalmente, quando os hearbeats são usados, os quadros de hearbeat são enviados após o intervalo de hearbeat após a última atividade de conexão. Quando três quadros de hearbeat falham (leva 3 x intervalo de hearbeat), a conexão deve ser fechada por servidor ou por cliente, obrigatoriamente, sem nenhum handshakes.

    
por 30.10.2014 / 20:10