Pergunta

estamos tenho um cliente que precisa receber mensagens interativas de um servidor, de clientes que são distribuídos em todo o mundo por trás de todos os tipos de firewalls com todos os tipos de portas fechadas. A única coisa que podemos confiar é HTTP porta 80 (e HTTPS 443).

O projeto é basicamente modelado após XMPP (o protocolo Jabber), usando o nosso cliente e IIS. Os problemas do cliente GET solicitações para um .NET Handler; o manipulador detém o aberto solicitação por um tempo à procura de mensagens. Se alguma mensagem chegar, eles são imediatamente enviados para o cliente; se não, depois de um tempo limite a conexão é fechada com uma resposta "sem dados". O cliente reabre imediatamente a comunicação.

Bem, teoricamente.

O que está realmente acontecendo é em primeiro lugar, IIS não pode lidar com mais de cerca de 100 solicitações simultâneas -. Os outros estão todos em fila, e pode haver um vários lag minutos entre "ligado" e IIS reconhecendo que o cliente chamado em segundo lugar, sobre metade do tempo o cliente expira sem qualquer resposta do servidor (o tempo limite do cliente é de cinco minutos a mais do que a do servidor).

POST sempre funciona. Outros dados serviram nas mesmas obras servidor web. serviços web no mesmo trabalho do servidor. Esta é uma instalação out-of-the-box no Windows 2K3 Server.

Existe uma opção de configuração que está faltando, ou há algo mais que eu deveria olhar para lidar com isso?

Graças.

Foi útil?

Solução

Eu acho que você está batendo limites thread pool do ASP.NET, em vez de IIS queridos. Olhar para a criação de um assíncrono HTTP handler (IHttpAsyncHandler) como quando eles bloqueiam / esperar que eles não estão amarrando o pool de threads (eles usam portas de conclusão em vez disso).

Atualizar : Veio este recentemente que parece concordar com o meu pensamento: CodeProject: Scalable COMET combinado com ASP.NET

Outras dicas

Se o IIS não atender às suas necessidades, você deve escolher outro servidor web, como Apache (com mod_mono ) ou LightTPD .

BTW, você pode túnel XMPP através de HTTP utilizando XMPP Ao longo BOSH . Não há necessidade de inventar um protocolo personalizado.

Fora da caixa, o Windows precisa de algum tweeking. Eu tive que implementar um servidor cometa em asp.net e correu para alguns padrões tolas. Depois de ler estes links:

Eu vim com as seguintes alterações que foram feitas para nossas janelas 2k8 servidor.

  • reg add HKLM \ System \ CurrentControlSet \ Services \ HTTP \ Parameters / v MaxConnections / t REG_DWORD / d 1000000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v TcpTimedWaitDelay / t REG_DWORD / d 30 / f
  • reg add HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0 / v MaxConcurrentThreadsPerCPU / t REG_DWORD / d 0 / f
  • reg add HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0 / v MaxConcurrentRequestsPerCPU / t REG_DWORD / d 30000 / f
  • appcmd.exe conjunto apppool "[nome do pool de aplicativo]" / QueueLength: 65535
  • appcmd.exe set config / section: serverRuntime / appConcurrentRequestLimit: 100000
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxUserPort / t REG_DWORD / d 65534 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxFreeTcbs / t REG_DWORD / d 2000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ Tcpip \ Parameters / v MaxHashTableSize / t REG_DWORD / d 2048 / f reg add HKLM \ System \ CurrentControlSet \ Services \ InetInfo \ Parameters / v MaxPoolThreads / t REG_DWORD / d 80 / f
  • appcmd set config / section: processModel / requestQueueLimit: 100000 / commit: MACHINE

Eu não sei se todas as mudanças eram necessárias ou ideal, mas com alguma tesing quik contra um servidor de teste, nós achived mais de 30k conexões executoras e 5k pedidos por segundo. Não foi possível ir mais longe porque eu corri para fora de máquinas cliente para executar os testes de.

XMPP nunca foi projetado para aplicações de alto desempenho. As mensagens devem atravessar toda a pilha para a camada de aplicação, e há um monte de análise XML. Já considerou usando algum outro padrão além XMPP?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top