HTML WebSockets mantiene una connessione aperta per ogni cliente? Questa scala?

Sono curioso di sapere se qualcuno ha informazioni sulla scalabilità di HTML WebSockets. Per tutto ciò che ho letto sembra che ogni cliente manterrà una linea di comunicazione aperta con il server. Mi sto solo chiedendo in che modo questa scala e quante connessioni WebSocket aperte possono gestire un server. Forse lasciare queste connessioni aperte non è un problema in realtà, ma sembra che sia così.

Nella maggior parte dei casi, WebSockets probabilmente scalerà meglio delle richieste AJAX / HTML. Tuttavia, ciò non significa che WebSockets è una sostituzione per tutti gli usi di AJAX / HTML.

Ogni connessione TCP in sé consuma molto poco in termini di risorse del server. Spesso l’impostazione della connessione può essere costosa, ma mantenendo una connessione intriggers è quasi gratuita. La prima limitazione che si incontra di solito è il numero massimo di descrittori di file (i socket consumano i descrittori di file) che possono essere aperti simultaneamente. Spesso questo valore è impostato su 1024, ma può essere facilmente configurato più in alto.

Hai mai provato a configurare un server Web per supportare decine di migliaia di client AJAX simultanei? Cambia quei client in client WebSockets e potrebbe essere fattibile.

Le connessioni HTTP, mentre non creano file aperti o consumano numeri di porta per un lungo periodo, sono più costose in quasi tutti gli altri modi:

  • Ogni connessione HTTP porta molto bagaglio che non viene utilizzato la maggior parte del tempo: cookie, tipo di contenuto, lunghezza del conetent, user-agent, id del server, data, ultima modifica, ecc. Una volta stabilita una connessione WebSockets, solo il i dati richiesti dall’applicazione devono essere inviati avanti e indietro.

  • In genere, i server HTTP sono configurati per registrare l’inizio e il completamento di ogni richiesta HTTP occupando il tempo del disco e della CPU. Diventerà standard per registrare l’avvio e il completamento dei dati WebSockets, ma mentre la connessione WebSockets esegue il trasferimento duplex non ci sarà alcun sovraccarico di registrazione aggiuntivo (tranne che dall’applicazione / servizio se è progettato per farlo).

  • In genere, le applicazioni interattive che utilizzano AJAX interrogano continuamente o utilizzano una sorta di meccanismo di polling lungo. WebSockets è un modo molto più pulito (e più scarso) di fare un modello event’d in cui il server e il client si notificano a vicenda quando hanno qualcosa da segnalare sulla connessione esistente.

  • La maggior parte dei popolari server Web in produzione dispone di un pool di processi (o thread) per la gestione delle richieste HTTP. Con l’aumento della pressione, la dimensione del pool verrà aumentata poiché ogni processo / thread gestisce una richiesta HTTP alla volta. Ogni processo / thread aggiuntivo utilizza più memoria e la creazione di nuovi processi / thread è un po ‘più costoso rispetto alla creazione di nuove connessioni socket (che quei processi / thread devono ancora fare). La maggior parte dei popolari framework per server WebSockets sta seguendo la rotta dell’evento che tende a ridimensionarsi e ad esibirsi meglio.

Il vantaggio principale di WebSockets saranno le connessioni a bassa latenza per le applicazioni Web interattive. Aumenterà le dimensioni e consumerà meno risorse del server rispetto a HTTP AJAX / polling lungo (presupponendo che l’applicazione / server sia progettata correttamente), ma la latenza IMO inferiore è il principale vantaggio di WebSockets perché abiliterà nuove classi di applicazioni Web che non sono possibili con l’overhead e la latenza correnti di AJAX / long-poll.

Una volta che lo standard WebSockets diventa più finalizzato e ha un supporto più ampio, avrà senso utilizzarlo per la maggior parte delle nuove applicazioni Web interattive che devono comunicare frequentemente con il server. Per le applicazioni Web interattive esistenti dipenderà davvero da quanto bene funziona il modello AJAX / long-poll attuale. Lo sforzo per la conversione non sarà banale, quindi in molti casi il costo non meriterà il beneficio.

Aggiornamento :

Link utile: 600k connessioni websocket simultanee su AWS utilizzando Node.js

Solo un chiarimento: il numero di connessioni client che un server può supportare non ha nulla a che fare con le porte in questo scenario, dal momento che il [in genere] sta solo ascoltando le connessioni WS / WSS su una singola porta. Penso a quello che gli altri commentatori intendevano fare riferimento ai descrittori di file. È ansible impostare il numero massimo di descrittori di file piuttosto elevato, ma è necessario prestare attenzione alle dimensioni del buffer del socket che si sumno per ciascun socket TCP / IP aperto. Ecco alcune informazioni aggiuntive: https://serverfault.com/questions/48717/practical-maximum-open-file-descriptors-ulimit-n-for-a-high-volume-system

Per quanto riguarda la latenza ridotta tramite WS vs HTTP, è vero poiché non c’è più parsing di intestazioni HTTP oltre l’handshake WS iniziale. Inoltre, man mano che vengono inviati con successo sempre più pacchetti, la finestra di congestione TCP si allarga, riducendo efficacemente l’RTT.

Qualsiasi singolo server moderno è in grado di gestire migliaia di client contemporaneamente . Il suo software server HTTP deve essere solo orientato Event-Driven (IOCP) (non siamo più nella vecchia connessione Apache one = un’equazione thread / processo più). Anche il server HTTP integrato in Windows (http.sys) è orientato all’IOCP e molto efficiente (in esecuzione in modalità kernel). Da questo punto di vista, non ci sarà molta differenza nel ridimensionamento tra WebSocket e la normale connessione HTTP. Una connessione TCP / IP utilizza una piccola risorsa (molto meno di un thread) e il sistema operativo moderno è ottimizzato per la gestione di molte connessioni simultanee: WebSockets e HTTP sono solo protocolli del livello dell’applicazione OSI 7, che ereditano da queste specifiche TCP / IP.

Ma, dall’esperimento, ho visto due problemi principali con WebSockets:

  1. Non supportano CDN;
  2. Hanno potenziali problemi di sicurezza.

Quindi consiglierei quanto segue, per qualsiasi progetto:

  • Usa WebSockets solo per le notifiche del client (con un meccanismo di fallback per il polling lungo – ci sono un sacco di librerie in giro);
  • Usa RESTful / JSON per tutti gli altri dati, utilizzando un CDN o proxy per la cache.

In pratica, le applicazioni WebSocket complete non si adattano bene. Basta usare WebSockets per ciò che sono stati progettati per: inviare notifiche dal server al client.

Informazioni sui potenziali problemi dell’utilizzo di WebSockets:

1. Considerare l’utilizzo di un CDN

Oggi (circa 4 anni dopo), il ridimensionamento del Web implica l’uso di front end Content Delivery Network (CDN), non solo per contenuto statico (html, css, js) ma anche per i dati dell’applicazione (JSON) .

Naturalmente, non inserirai tutti i tuoi dati nella cache CDN, ma in pratica molti contenuti comuni non cambieranno spesso. Sospetto che l’80% delle risorse REST possa essere memorizzato nella cache … Anche un timeout di scadenza CDN di un minuto (o 30 secondi) può essere sufficiente per dare al tuo server centrale un nuovo live e migliorare molto la reattività dell’applicazione, dal momento che CDN può essere sintonizzato geograficamente …

Per quanto ne so, non esiste ancora il supporto di WebSockets in CDN e sospetto che non lo sarà mai. WebSockets sono statefull, mentre HTTP è senza stato, quindi è facilmente memorizzabile nella cache. In effetti, per rendere WebSockets compatibile con CDN, potrebbe essere necessario passare a un approccio RESTful stateless … che non sarebbe più WebSockets.

2. Problemi di sicurezza

I WebSocket presentano potenziali problemi di sicurezza, in particolare per quanto riguarda gli attacchi DOS. Per ulteriori informazioni sulle nuove vulnerabilità della sicurezza, vedere questo set di diapositive e questo ticket webkit .

I WebSocket evitano qualsiasi possibilità di controllo dei pacchetti a livello di livello dell’applicazione OSI 7, che diventa piuttosto standard al giorno d’oggi, in qualsiasi sicurezza aziendale. Infatti, WebSockets rende la trasmissione offuscata, quindi potrebbe essere una grave violazione della perdita di sicurezza.

Pensaci in questo modo: cosa è più economico, mantenendo una connessione aperta o aprendo una nuova connessione per ogni richiesta (con il sovraccarico di negoziazione di farlo, ricorda che è TCP).

Naturalmente dipende dall’applicazione, ma per le connessioni in tempo reale a lungo termine (ad es. Una chat AJAX) è molto meglio mantenere aperta la connessione.

Il numero massimo di connessioni sarà limitato dal numero massimo di porte libere per i socket.

No, non scala, dà un enorme lavoro agli interruttori di percorsi intermedi. Quindi sul lato server gli errori di pagina (devi mantenere tutti quei descrittori) stanno raggiungendo valori elevati e aumenta il tempo per portare una risorsa nell’area di lavoro. Questi sono per lo più server scritti JAVA e potrebbe essere più veloce tenere su quei gazilions di socket quindi distruggerli / crearne uno. Quando si esegue un server di questo tipo su una macchina, qualsiasi altro processo non può più muoversi.