Domanda

Per implementare un server che supporta i client che utilizzano prese web , non i server mantengono una connessione HTTP aperta con ogni cliente? Come può questa scala?

Quali sono i "modelli di programmazione" in sede di attuazione di questo tipo di server? Vale a dire: la maggior parte delle applicazioni web hanno servlet, ecc che supportano un Connect-> request-> response-> close tipo di modello. Considerando che con web socket i soggiorni di connessione aperta indefinitamente.

È stato utile?

Soluzione

È in genere bisogno di lavorare in un asincrono modello per questi collegamenti a lunga durata a lavoro. Ci sono diverse tecniche diverse per fare I / O asincrono; ognuno dei quali hanno i loro vantaggi e svantaggi.

Uno che dovrebbe già essere familiare a chi ha lavorato con JavaScript e AJAX è il modello di callback; in cui si invia una richiesta, e installa un callback da chiamare quando completa. Ecco come funziona XMLHTTPRequest, senza bloccare tutte le altre pagine mentre aspettano per la richiesta di una pagina per terminare. Questo è anche il modo il quadro di rete intrecciata Python funziona, anche se può chiamare metodi su oggetti o le funzioni di callback a seconda della interfacce si utilizza.

Un altro modello è il potente Erlang approccio stile, chiamato il modello di attore, ha molti, molti processi leggeri ( come fili, ma senza stato condiviso), ciascuno dei quali comunicano tra loro tramite messaggi asincroni. Il tempo di esecuzione Erlang è stato implementato per rendere deposizione delle uova migliaia di processi molto efficienti; allora si può solo avere un processo per ogni connessione, e li hanno inviare messaggi ad altri processi di attuazione del backend della vostra applicazione. processi Erlang possono anche essere programmato automaticamente su più thread OS, per sfruttare appieno sistemi multi-core. ejabberd , un popolare server Jabber (un protocollo di chat, che richiede molte connessioni aperte lunga durata), è implementata in Erlang, come è il Facebook Chat sistema .

Il nuovo Vai lingua da Google utilizza un approccio simile, più vicino al di Hoare Comunicare sequenziale rispetto al modello Attore di Erlang, ma che ha un sacco di somiglianze.

In Mac OS X 10.6, Apple ha introdotto Grand Central Dispatch , insieme a blocchi (chiusure essenzialmente ) in C, C ++ e Objective-C. In questo modo qualcosa come AJAX o ritorto event driven modello di callback stile, ma con code esplicitamente gestiti che eseguita in modo sequenziale per gestire l'accesso alle risorse condivise in un multithread, ambiente multi-core. Ritorto e JavaScript sia gestito thread singolo, e così può valersi di un singolo core, se non si utilizzano più processi del sistema operativo, che può essere peso abbastanza pesante e aumentare i costi di comunicazione tra loro.

Poi ci sono i modelli più tradizionali, come l'Unix select funzione o il epoll o kqueue() . In questi, in genere si dispone di un ciclo principale nel vostro programma, che stabilisce una serie di eventi da guardare per (rete di I / O restituisce alcuni più dati, file di I / O ritorna più dati, una nuova connessione di rete viene effettuata, ecc) , e poi chiama una chiamata di sistema che blocca fino uno di quegli eventi è verificato, a quel punto si controlla quale si è verificato e quindi gestire in modo appropriato. Queste chiamate di sistema sono generalmente utilizzati per fornire i quadri di livello più alto sopra descritte.

Per una buona panoramica della impressionante serie di opzioni disponibili (focalizzata sul livello più tradizionale, e più basso, Unix approcci), vedi Il C10K problema , un sondaggiodi tecniche diverse per aiutare a gestire 10.000 connessioni simultanee contemporaneamente. Questo ha anche una buona lista di librerie C e C ++ per astrarre sulle varie API disponibili, come ad esempio libevent .

Un ultima opzione, naturalmente, è quello di utilizzare un processo o un thread OS per ciascuna connessione. Il problema è, processi sono il peso molto pesanti, e anche i fili sono abbastanza pesante rispetto a molte di queste opzioni. In generale, per le migliori prestazioni, si vorrebbe avere un processo o thread per CPU, ognuna con un I / O asincrono API per capire quando è necessario fare il lavoro, e poi dispacciamento che il lavoro di uno dei diversi oggetti o callback che sono stati registrati per gestire le connessioni, o uno dei diversi processi leggeri in stile Erlang che è in attesa di un messaggio, o qualcosa del genere.

Come nota laterale, il collegamento a prese web non sono connessioni HTTP, ma un nuovo protocollo, il websocket protocollo , anche se è possibile utilizzare la stessa porta come HTTP, e aggiornare una connessione HTTP a una presa di rete in modo da essere compatibile con le regole del firewall esistenti.

Altri suggerimenti

In linea generale, si dovrebbe aspettare di utilizzare WebSockets con implementazioni di server progettati per gestire il carico in modo leggero. Tali server esistono già per longeva connessioni COMET e simili.

è diverso da http dal fatto che ogni successiva richiesta / risposta non ha bisogno di essere avvolto in un messaggio HTTP con le intestazioni HTTP. così le applicazioni in tempo reale non avrebbe bisogno il sovraccarico di analizzare le intestazioni. dopo la stretta di mano iniziale di http-like, si comporta praticamente come un socket TCP regolare ol'.

questo potrebbe essere modellato con servlet, ma avrebbe solo bisogno di distinguere tra la richiesta iniziale (con tutte le intestazioni) e la successiva finestra di dialogo a 2 vie il cui formato è arbitrario per la maggior parte.

Date un'occhiata a HTML 5 WebSockets implementate in Tornado server web: http://bret.appspot.com/entry/web-sockets-in- tornado

Non ho giocato con questo modulo ancora, però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top