2013-09-03 28 views
10

Sto sperimentando con Rails 4 ActionController::Live e Server Sent Events. Sto usando MRI 2.0.0 e Puma.Streaming server e eventi inviati

Per quello che posso vedere, ogni client connesso mantiene una connessione attiva al server. Mi chiedevo se è possibile sfruttare SSE senza tenere tutti i flussi di risposta in esecuzione.

Puma gestisce più connessioni tramite thread e immagino ci sia un limite al numero di connessioni cuncurrent.
E se volessi supportare uno scenario del mondo reale con migliaia di clienti che si registrano alla mia app Rails per eventi SSE?

C'è qualche esempio?

Inoltre, di solito eseguo i server di applicazioni Rails dietro un proxy inverso di nginx. Richiederebbe una configurazione particolare?

risposta

3

Il modo in cui gli SSE vengono creati è il client che apre una connessione al server, che rimane aperta finché il server non ha alcuni dati da inviare. Questo fa parte delle specifiche SSE e non è una cosa specifica per ActionController :: Live. È effettivamente uguale al polling lungo, ma con la connessione che non viene chiusa dopo che è stato restituito il primo bit di dati e con il meccanismo integrato nel browser.

Come tale, l'unico modo in cui può essere implementato è avere più connessioni client aperte al server web che si siedono lì indefinitamente. Per quanto riguarda le risorse necessarie per gestirle, non ne sono sicuro, poiché non ho ancora provato a fare un benchmark, ma per Puma occorreranno abbastanza server per mantenere aperte migliaia di connessioni se si hanno molti utenti con una pagina aperta.

Il limite predefinito per puma è di 16 connessioni simultanee. Diversi post sui blog relativi alla configurazione di SSE per Rails menzionano questo valore ad un valore maggiore, ma nessuno di quelli che ho trovato suggerisce quale dovrebbe essere questo valore più alto. Dicono che il numero di connessioni DB dovrà essere lo stesso, dato che ogni thread di Rails ne mantiene uno in esecuzione. Una specie di suono sembra un modo costoso per eseguire le cose.

"Eseguire un punto di riferimento" è l'unica risposta davvero.

Non posso commentare come invertire il proxy poiché non l'ho provato, ma poiché gli SSE sono eseguiti su HTTP standard, non dovrei pensare che sia necessaria alcuna configurazione speciale.

+0

Ok, grazie per il vostro feedback! – tompave

+1

qualcuno ha effettivamente fatto un simile punto di riferimento? – nicolas

+0

Non ho eseguito un benchmark, ma alla fine ho respinto il tentativo poiché _non la produzione era pronta_. Temo che per questo tipo di scenari sia necessario utilizzare un modello evented. – tompave

Problemi correlati