Resumindo: você deve ser capaz de alcançar na ordem de milhões de conexões TCP ativas simultâneas e, por extensão, solicitação (ões) HTTP. Isso indica o desempenho máximo que você pode esperar com a plataforma certa com a configuração certa.
Hoje, eu estava preocupado se o IIS com ASP.NET ofereceria suporte na ordem de 100 conexões simultâneas (veja minha atualização, espere cerca de 10 mil respostas por segundo em versões mais antigas do ASP.Net Mono). Quando vi esta pergunta / respostas, não pude resistir a responder a mim mesmo, muitas respostas para a pergunta aqui estão completamente incorretas.
Melhor caso
A resposta a esta pergunta deve se preocupar apenas com a configuração de servidor mais simples para desacoplar das inúmeras variáveis e configurações possíveis downstream.
Portanto, considere o seguinte cenário para minha resposta:
- Nenhum tráfego nas sessões TCP, exceto para pacotes keep-alive (caso contrário, você obviamente precisaria de uma quantidade correspondente de largura de banda de rede e outros recursos do computador)
- Software projetado para usar soquetes e programação assíncronos, em vez de um thread de hardware por solicitação de um pool. (ou seja, IIS, Node.js, Nginx ... servidor da web [mas não Apache] com software de aplicativo projetado assíncrono)
- Bom desempenho / CPU / Ram em dólares. Hoje, arbitrariamente, digamos i7 (4 núcleos) com 8 GB de RAM.
- Um bom firewall / roteador para combinar.
- Sem limite / governador virtual - ou seja. Linux somaxconn, IIS web.config ...
- Sem dependência de outro hardware mais lento - sem leitura do disco rígido, porque seria o menor denominador comum e gargalo, não IO de rede.
Resposta Detalhada
Projetos síncronos vinculados a threads tendem a ter o pior desempenho em relação às implementações de E / S assíncronas.
O WhatsApp obtém um milhão de tráfego COM em uma única máquina com sistema operacional Unix - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ .
E, finalmente, este, http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html , apresenta muitos detalhes , explorando como até 10 milhões poderiam ser alcançados. Os servidores geralmente têm mecanismos de descarregamento de TCP de hardware, ASICs projetados para essa função específica com mais eficiência do que uma CPU de uso geral.
Boas opções de design de software
O projeto de IO assíncrono será diferente entre os sistemas operacionais e plataformas de programação. Node.js foi projetado com assíncrono em mente. Você deve usar Promises pelo menos, e quando o ECMAScript 7 aparecer, async
/ await
. C # /. Net já tem suporte assíncrono completo, como node.js. Qualquer que seja o sistema operacional e a plataforma, deve-se esperar que o assíncrono funcione muito bem. E qualquer que seja o idioma que você escolher, procure a palavra-chave "assíncrona", a maioria dos idiomas modernos terá algum suporte, mesmo que seja algum tipo de complemento.
Para a WebFarm?
Qualquer que seja o limite para sua situação particular, sim, um web farm é uma boa solução para o dimensionamento. Existem muitas arquiteturas para fazer isso. Uma é usar um balanceador de carga (os provedores de hospedagem podem oferecer isso, mas mesmo esses têm um limite, junto com o teto de largura de banda), mas não sou a favor dessa opção. Para aplicativos de página única com conexões de longa duração, prefiro ter uma lista aberta de servidores que o aplicativo cliente escolherá aleatoriamente na inicialização e reutilizará durante a vida útil do aplicativo. Isso remove o ponto único de falha (balanceador de carga) e permite o dimensionamento em vários data centers e, portanto, muito mais largura de banda.
Acabando com um mito - portas de 64K
Para abordar o componente da pergunta sobre "64.000", isso é um equívoco. Um servidor pode se conectar a mais de 65535 clientes. Consulte /networkengineering/48283/is-a-tcp-server-limited-to-65535-clients/48284
A propósito, o Http.sys no Windows permite que vários aplicativos compartilhem a mesma porta do servidor no esquema de URL HTTP. Cada um deles registra uma ligação de domínio separada, mas, em última análise, há um único aplicativo de servidor que faz o proxy das solicitações para os aplicativos corretos.
Atualização 30/05/2019
Aqui está uma comparação atualizada das bibliotecas HTTP mais rápidas - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
- Data do teste: 06/06/2018
- Hardware usado: Dell R440 Xeon Gold + 10 GbE
- O líder tem aproximadamente 7 milhões de respostas em texto simples por segundo (respostas, não conexões)
- O segundo Fasthttp para golang anuncia 1,5 milhões de conexões simultâneas - consulte https://github.com/valyala/fasthttp
- As linguagens principais são Rust, Go, C ++, Java, C e até mesmo C # classifica em 11 (6,9 milhões por segundo). Scala e Clojure são classificados mais abaixo. Python ocupa a 29ª posição com 2,7 milhões por segundo.
- No final da lista, noto laravel e cakephp, rails, aspnet-mono-ngx, symfony, zend. Tudo abaixo de 10k por segundo. Observe que a maioria dessas estruturas são construídas para páginas dinâmicas e, bastante antigas, podem haver variantes mais novas que aparecem no topo da lista.
- Lembre-se de que este é um texto simples HTTP, não para a especialidade do Websocket: muitas pessoas que vêm aqui provavelmente estarão interessadas em conexões simultâneas para websocket.