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:
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.
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:
- Get Closer to the Wire with High-Performance Sockets in .NET
- Tips/techniques for high-performance C# server sockets
- High Performance TCP/IP Server using C#.NET
Justa ha pensato: hai considerato una strategia di bilanciamento del carico per questo con più server? – byte
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
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) –