Estou curioso para saber se alguém tem alguma informação sobre a escalabilidade do HTML WebSockets. Por tudo que li, parece que todo cliente manterá uma linha aberta de comunicação com o servidor. Só estou me perguntando como isso é dimensionado e quantas conexões abertas do WebSocket um servidor pode suportar. Talvez deixar essas conexões abertas não seja um problema na realidade, mas parece que é.
159
Respostas:
Em muitos aspectos, os WebSockets provavelmente terão uma escala melhor que as solicitações AJAX / HTML. No entanto, isso não significa que o WebSockets seja um substituto para todos os usos do AJAX / HTML.
Cada conexão TCP, por si só, consome muito pouco em termos de recursos do servidor. Muitas vezes, a configuração da conexão pode ser cara, mas manter uma conexão inativa é quase gratuita. A primeira limitação geralmente encontrada é o número máximo de descritores de arquivo (soquetes consomem descritores de arquivo) que podem ser abertos simultaneamente. Geralmente, o padrão é 1024, mas pode ser facilmente configurado mais alto.
Já tentou configurar um servidor da Web para suportar dezenas de milhares de clientes AJAX simultâneos? Mude esses clientes para clientes WebSockets e isso pode ser possível.
As conexões HTTP, embora não criem arquivos abertos ou consumam números de porta por um longo período, são mais caras em praticamente todas as outras formas:
Cada conexão HTTP carrega muita bagagem que não é usada na maioria das vezes: cookies, tipo de conteúdo, comprimento conetente, agente do usuário, ID do servidor, data, última modificação, etc. Depois que uma conexão WebSockets é estabelecida, somente o os dados exigidos pelo aplicativo precisam ser enviados e enviados.
Normalmente, os servidores HTTP são configurados para registrar o início e a conclusão de cada solicitação HTTP, ocupando o tempo do disco e da CPU. Tornar-se-á padrão registrar o início e a conclusão dos dados do WebSockets, mas enquanto a conexão dos WebSockets estiver realizando a transferência duplex, não haverá sobrecarga adicional de registro (exceto pelo aplicativo / serviço, se ele for projetado para isso).
Normalmente, aplicativos interativos que usam AJAX pesquisam continuamente ou usam algum tipo de mecanismo de pesquisa longa. O WebSockets é uma maneira muito mais limpa (e de recursos mais baixos) de fazer um modelo com mais eventos, em que o servidor e o cliente se notificam quando têm algo a relatar pela conexão existente.
A maioria dos servidores Web populares em produção possui um conjunto de processos (ou threads) para lidar com solicitações HTTP. À medida que a pressão aumenta, o tamanho do pool aumentará, pois cada processo / encadeamento lida com uma solicitação HTTP por vez. Cada processo / encadeamento adicional usa mais memória e a criação de novos processos / encadeamentos é um pouco mais caro do que criar novas conexões de soquete (o que esses processos / encadeamentos ainda precisam fazer). A maioria das estruturas populares de servidores WebSockets segue a rota do evento, que tende a escalar e ter melhor desempenho.
O principal benefício do WebSockets serão as conexões de menor latência para aplicativos interativos da Web. Ele será dimensionado melhor e consumirá menos recursos do servidor do que o HTTP AJAX / pesquisa longa (supondo que o aplicativo / servidor tenha sido projetado corretamente), mas a latência mais baixa da IMO é o principal benefício do WebSockets, pois permitirá novas classes de aplicativos da Web que não são possíveis com a sobrecarga atual e latência de AJAX / pesquisa longa.
Quando o padrão WebSockets se tornar mais finalizado e tiver um suporte mais amplo, fará sentido usá-lo para a maioria dos novos aplicativos interativos da Web que precisam se comunicar com frequência com o servidor. Para aplicativos da Web interativos existentes, isso realmente dependerá de quão bem o modelo atual de AJAX / pesquisa longa está funcionando. O esforço para converter será não trivial, portanto, em muitos casos, o custo não valerá o benefício.
Atualização :
Link útil: 600k conexões simultâneas de websocket na AWS usando o Node.js
fonte
Apenas um esclarecimento: o número de conexões do cliente que um servidor pode suportar não tem nada a ver com portas nesse cenário, pois o servidor [normalmente] está apenas ouvindo conexões WS / WSS em uma única porta. Eu acho que o que os outros comentadores pretendiam se referir eram descritores de arquivos. Você pode definir o número máximo de descritores de arquivo bastante alto, mas é necessário observar os tamanhos de buffer de soquete que se somam a cada soquete TCP / IP aberto. Aqui estão algumas informações adicionais: /server/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system
Quanto à latência reduzida via WS vs. HTTP, é verdade, pois não há mais análise de cabeçalhos HTTP além do handshake inicial do WS. Além disso, à medida que mais e mais pacotes são enviados com êxito, a janela de congestionamento do TCP aumenta, reduzindo efetivamente o RTT.
fonte
Qualquer servidor único e moderno pode atender milhares de clientes de uma só vez . Seu software de servidor HTTP precisa ser orientado a IOCP (Event-Driven) (não estamos mais no Apache antigo, uma conexão = uma equação de thread / processo). Até o servidor HTTP incorporado no Windows (http.sys) é orientado para IOCP e muito eficiente (executando no modo kernel). Desse ponto de vista, não haverá muita diferença no dimensionamento entre o WebSockets e a conexão HTTP normal. Uma conexão TCP / IP usa pouco recurso (muito menos que um encadeamento) e o SO moderno é otimizado para lidar com muitas conexões simultâneas: WebSockets e HTTP são apenas protocolos da camada de aplicativo OSI 7, herdados dessas especificações TCP / IP.
Mas, por experiência, vi dois problemas principais com os WebSockets:
Na prática, os aplicativos WebSockets completos não se adaptam bem. Basta usar o WebSockets para o que eles foram projetados: notificações por push do servidor para o cliente.
Sobre os possíveis problemas do uso de WebSockets:
1. Considere usar uma CDN
Hoje (quase 4 anos depois), o dimensionamento da Web envolve o uso de front-ends da Content Delivery Network (CDN), não apenas para conteúdo estático (html, css, js), mas também para os dados do aplicativo (JSON) .
Obviamente, você não colocará todos os seus dados no cache da CDN, mas, na prática, muito conteúdo comum não será alterado com frequência. Suspeito que 80% dos seus recursos REST possam estar armazenados em cache ... Mesmo o tempo limite de expiração da CDN de um minuto (ou 30 segundos) pode ser suficiente para dar ao servidor central uma nova energia ao vivo e aprimorar muito a capacidade de resposta do aplicativo, pois a CDN pode ser ajustado geograficamente ...
Que eu saiba, ainda não há suporte para WebSockets na CDN e suspeito que nunca seria. Os WebSockets são válidos para o estado, enquanto o HTTP é sem estado, portanto, é muito facilmente armazenado em cache. De fato, para tornar o WebSockets compatível com CDN, pode ser necessário mudar para uma abordagem RESTful sem estado ... que não seria mais o WebSockets.
2. Questões de segurança
Os WebSockets têm possíveis problemas de segurança, especialmente sobre ataques do DOS. Para obter uma ilustração sobre as novas vulnerabilidades de segurança, consulte este conjunto de slides e este ticket de webkit .
Os WebSockets evitam qualquer chance de inspeção de pacotes no nível da camada de aplicativos OSI 7, que hoje em dia é bastante padrão em qualquer segurança comercial. De fato, o WebSockets torna a transmissão ofuscada, por isso pode ser uma grande violação do vazamento de segurança.
fonte
Pense desta maneira: o que é mais barato, mantendo uma conexão aberta ou abrindo uma nova conexão para cada solicitação (com a sobrecarga de negociação para isso, lembre-se de que é TCP).
É claro que depende da aplicação, mas para conexões em tempo real a longo prazo (por exemplo, um bate-papo AJAX), é muito melhor manter a conexão aberta.
O número máximo de conexões será limitado pelo número máximo de portas livres para os soquetes.
fonte
Não, ele não escala, dá um tremendo trabalho aos comutadores de rotas intermediárias. Em seguida, no lado do servidor, as falhas de página (é necessário manter todos esses descritores) estão atingindo valores altos e o tempo para trazer um recurso para a área de trabalho aumenta. Estes são principalmente servidores escritos em JAVA e pode ser mais rápido manter esses gazilions de soquetes do que destruir / criar um. Quando você executa esse servidor em uma máquina, qualquer outro processo não pode mais se mover.
fonte