2010-11-10 13 views
6

Sto creando un server per monitorare la presenza online di client su una pagina web.Come gestire connessioni HTTP fino a 100k in .Net

  • Ci saranno 80-100 000 (ottantamila) client simultanei da monitorare.
  • Sto usando .Net per scrivere questo.

I client contatteranno un server (separato) utilizzando JavaScript (nella pagina HTML) per comunicare al server che sono vivi/online.

Sto pensando di uno dei due approcci:

  1. connessioni persistenti con keep-alive ha inviato regolarmente. Questo mi darà una precisione molto maggiore su quando i client si disconnettono e non ho bisogno di aggiornare la struttura della memoria (onlineinfo) troppo spesso perché sappiamo quando il cliente va e viene. Ulteriori vantaggi per le apparecchiature di rete/larghezza di banda.

  2. I client (ri) si collegano a intervalli per indicare al server che sono vivi. Ciò richiede molte connessioni e ridurrà necessariamente la precisione. Immagino che intervalli come 2-3 minuti siano il meglio che possiamo fare. 80k/120 = 660 connessioni al secondo ... ASP.Net non viene eseguito troppo velocemente, quindi non sono sicuro di questo. 8 core system = ~ 10 ms per esecuzione.

Con queste numerose connessioni ci sono ovviamente alcune limitazioni. Ad esempio, non posso generare simultaneamente tanti thread. 1 richiesta a IIS spawning un'applicazione ASP.Net utilizzerà 1 thread fino al completamento della richiesta.

È la migliore opzione per scrivere un server http autonomo? Does not. Nets TcpListener fa leva su httpd.sys (IIS)?

Qualsiasi pensiero (costruttivo) sull'argomento sarebbe apprezzato.

Edit: L'aggiunta di alcuni link utili a questo post trovato seguendo i link da Nicolas Repiquets risposta:

+7

Justa ha pensato: hai considerato una strategia di bilanciamento del carico per questo con più server? – byte

+0

Fintanto che i client non richiedono molta elaborazione per ogni "richiesta" keep-alive, non vedo alcun motivo per cui non si dovrebbe essere in grado di farlo. – Gabe

+0

Problema interessante! L'unica cosa che posso consigliarti è che stai giocando con i limiti .NET e TCP/IP. Qualunque soluzione tu implementi, pensa dapprima su come ridimensionare. (dividi il carico in più server) –

risposta

4

100 000 connessioni persistenti è non è un'opzione praticabile.

L'invio di richieste HTTP a intervalli è molto più fattibile e la scrittura di un server HTTP dedicato è una scelta interessante IMO.

Dai un'occhiata a this question per alcuni orientamenti.

+0

Perché non è un'opzione valida? Windows supporta questo numero di connessioni purché non sia/per le stesse coppie IP, nel qual caso si applica il limite di 65k. –

+1

Finirai per esaurire la memoria molto prima che finisca la porta libera. Prova a _gestificare_ l'impronta di memoria di una singola connessione e moltiplicare per 100000 ... –

+1

Nicolas: Supponendo che ogni connessione richieda 1k di dati e tu abbia 100.000 connessioni, l'utilizzo totale sarà 100.000k o 100M. È passato più di un decennio da quando avevo un server che non conteneva 100M di memoria. – Gabe

0

So che dici in particolare .NET, ma probabilmente dovresti dare un'occhiata a NodeJS, poiché fa esattamente ciò che stai cercando di fare, ma è JavaScript sul lato server.

Problemi correlati