Sto creando un daemon basato su TCP per la pre/post-elaborazione delle richieste HTTP. I client si collegheranno ad Apache HTTPD (o IIS) e un modulo Apache/IIS personalizzato inoltrerà richieste al mio daemon TCP per un'ulteriore elaborazione. Il mio demone dovrà aumentare (ma non uscire) per gestire un traffico significativo e la maggior parte delle richieste sarà di piccole dimensioni e di breve durata. Il demone sarà costruito in C++ e deve essere multipiattaforma.Server TCP con boost :: asio, scalabilità del pool di thread e coroutine stackless
Attualmente sto esaminando le librerie asio boost, che sembrano una scelta naturale. Tuttavia, ho difficoltà a comprendere i vantaggi del modello di poolless threadless coroutine vs thread. Nello specifico, sto guardando l'esempio del server HTTP n. 3 e l'esempio del server HTTP n. 4 qui: http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html
Nonostante tutto il mio google, non riesco a comprendere appieno i meriti del server coroutine senza stack e come sarebbe eseguire relativamente al server del pool di thread su un sistema multi-core.
Quale dei due è più adatto alle mie esigenze e perché? Per favore, sentiti libero di 'mollare' le tue risposte riguardo l'idea di coroutine senza pila, sono ancora su un terreno instabile qui. Grazie!
Edit: Un altro caso pensiero/preoccupazione per la discussione: Boost server HTTP esempio # 4 è descritto come "un server HTTP a thread singolo implementato utilizzando coroutine stackless". OK, quindi è interamente single-threaded (giusto? Anche dopo il processo genitore 'fork' a un bambino? Vedere server.cpp nell'esempio # 4) ... il thread singolo diventerà un collo di bottiglia su un sistema multi-core? Suppongo che qualsiasi operazione di blocco impedirà l'esecuzione di tutte le altre richieste. Se questo è davvero il caso, per massimizzare il throughput sto pensando ad un evento asincrono di ricezione dati basato su coroutine, un pool di thread per le mie attività di blocco interno (per sfruttare i multi core), e quindi un meccanismo di connessione chiusa di invio asincrono &. Ancora una volta, la scalabilità è fondamentale. qualche idea?
* Domanda *: Penso di aver capito "per aumentare". Cosa è "scalare"? –
Alcune persone trovano più semplice l'approccio co-routine da leggere/implementare perché il codice viene letto dall'alto verso il basso. Si adattano meglio allo streaming del parsing perché non devi preoccuparti di riprendere da dove avevi interrotto una volta che hai iniziato a consumare di nuovo lo stream dopo un'interruzione nell'input. – avid
@avid - grazie, ho visto nell'esempio del server HTTP di boost n. 4 come l'hanno fatto con il parser della richiesta. È molto bello, senza dubbio, ma sono più interessato alle prestazioni che alla facilità di codifica/implementazione. Cosa ne pensi di questo? – Tom