Estamos tentando projetar uma arquitetura que seja capaz de lidar com mais de 64k websockets.
Tentamos primeiro com o Amazon ELB, mas seu design não permite picos inesperados de tráfego nem websocket. (O modo TCP atinge o tempo limite dos websockets inesperadamente)
Com o HAProxy, esses limites não se aplicam, mas estaremos limitados a aproximadamente 64k websockets mantidos entre o HA e os servidores de back-end.
Várias soluções que me vieram à mente:
- Múltiplas instâncias HAProxy, balanceamento de carga com DNS (Route53 tem uma opção ponderada)
- Duas instâncias HAProxy com Keepalived, vários endereços IP internos (não tenho certeza se é possível)
Existe uma maneira melhor de fazer isso ?
Se o seu limite de 64k é devido às portas de origem, você pode fazer algo como o seguinte (um pouco hacky, mas foi o que fazemos atualmente no SE para websockets (temos algo como 0,5 milhões simultâneos geralmente com HAProxy):
Além disso, várias instâncias são possíveis com keepalived. Basta fazer algo como DNS round robin em vários IPs. Apenas certifique-se de que os IPs sempre sejam captados por balanceadores de carga ativos, pois o próprio DNS não fornecerá o balanceamento de carga (há mais opções aqui também, esta é simples).
Você pode configurar vários sistemas HAproxy que compartilham os mesmos IPs usando Anycast e BGP ou algum outro protocolo de roteamento de borda. Desta forma, todos os sistemas HAproxy estão ativos; se algum deles cair, você para de anunciar a rota BGP nesse sistema e, em ~ 30 segundos, para de receber tráfego; que serão redistribuídos para outros sistemas disponíveis que anunciam a mesma gama.
Por exemplo, verifique este URL sobre como configurar esse layout