Balanceador de carga do Apache para mod_proxy_wstunnel?

2

Estamos no processo de desenvolvimento de um aplicativo JavaEE 7 a ser implantado no JBoss / Wildfly que fará uso extensivo dos Web Sockets. Estamos usando mod_proxy_wstunnel para suporte a soquete da web e conseguimos configurar uma configuração com proxy por meio do uso de mod_cluster no Apache 2.4:

Internet - > Apache HTTPD - > Wildfly

Agora estamos diante do problema de agrupar esse aplicativo. Teremos pelo menos 4 nós em funcionamento para escalabilidade de desempenho e alta disponibilidade. Eu tentei criar um elemento <Proxy /> com 2 servidores membros para fazer isso. Parecia algo assim:

<VirtualHost *:80>
   ...

   <Proxy balancer://myBalancer>
     BalancerMember ws://localhost:9080
     BalancerMember ws://localhost:19080
   </Proxy>

   <Location /ws>
     ...

     ProxyPass balancer://myBalancer/MyContextPath/myWebSocketEndpoint
     ProxyPassReverse balancer://myBalancer/MyContextPath/myWebSocketEndpoint
   </Location>
</VirtualHost>

Isso, no entanto, não funciona. Eu sempre recebo erros de conexão em JavaScript ao tentar abrir o soquete da Web no caminho http://localhost/ws . Dei uma olhada rápida na documentação de mod_proxy_balancer e notei que ela declara suporte para os protocolos HTTP, FTP e AJP13. Existe uma maneira de equilibrar a carga sockets da web e o protocolo WS também? Ou esta é uma configuração completamente sem suporte? Quais outras alternativas eu poderia aproveitar para conseguir isso? Obviamente, ter um único servidor de soquete da web como nosso terminal de produção é inaceitável, pois representa um único ponto de falha. Eu apreciaria muito qualquer conselho que você possa dar!

    
por Shadowman 30.07.2014 / 22:49

3 respostas

1

De acordo com a documentação oficial do Apache: link

mod_proxy_balancer requer o serviço de mod_proxy e fornece balanceamento de carga para todos os protocolos suportados. Os mais importantes são:

  • HTTP, usando mod_proxy_http
  • FTP, usando mod_proxy_ftp
  • AJP13, usando mod_proxy_ajp
  • WebSocket, usando mod_proxy_wstunnel

para definir seu balanceador:

<Proxy balancer://wsBalancer>
    BalancerMember ws://host1:9080 route=jvm1
    BalancerMember ws://host2:9080 route=jvm2
    ProxySet lbmethod=byrequests stickysession=JSESSIONID
</Proxy>

faça chamadas do ws para esse balanceador:

<LocationMatch "^/cometd/.*">
    ProxyPass "balancer://wsBalancer/" stickysession=JSESSIONID
</LocationMatch>   

Onde aqui / cometd / é o contexto WS da sua aplicação.

    
por 12.10.2016 / 17:53
0

Não tenho certeza se isso pode ou não ser feito com o Apache + mod_proxy.

No que diz respeito às alternativas ao Apache, existem outras soluções comerciais que fornecem suporte para balanceamento de carga e Websocket. O balanceador de carga Ishlangu da Shaka Technologies, o ADC, suporta websockets transparentes (sem configuração) . Eu acredito que F5 BIG-IP também.

    
por 03.08.2014 / 22:02
0

Desde o 2.4.5 existe o módulo mod_proxy_wstunnel que fornece suporte ao protocolo WebSocket (ws: //) e seguro WebSocket (wss: //) para o mod_proxy. No entanto wss só é utilizável com 2.4.10 + devido a um bug em versões anteriores (PR55320).

Mesmo que não seja explicitamente mencionado na documentação, você pode usar o protocolo ws (s) com mod_proxy (e mod_proxy_balancer) como qualquer outro protocolo suportado. Apenas certifique-se de que mod_proxy_wstunnel esteja realmente carregado.

A partir da descrição, não está claro se há algum erro utilizável nos logs do Apache. Tem certeza de que seu aplicativo da web acessa apenas /ws ? Pode haver uma incompatibilidade de caminho, /ws/anything terminará como /MyContextPath/myWebSocketEndpoint/anything em seu servidor WebSocket, que provavelmente não é o que você deseja.

Se este for o caso, você preferiria:

<Proxy balancer://myBalancer>
    BalancerMember ws://localhost:9080
    BalancerMember ws://localhost:19080
</Proxy>

RewriteEngine On
RewriteRule /ws(/.*)? balancer://myBalancer/MyContextPath/myWebSocketEndpoint [P,L]
    
por 08.09.2014 / 19:59