Quando si utilizza Server-Sent Events nel caso in cui il client stabilisca più connessioni per ricevere eventi diversi a cui è interessato, o dovrebbe esserci una singola connessione e il client indica che cosa è interessato tramite un canale separato? IMO quest'ultimo sembra più preferibile anche se ad alcuni potrebbe rendere il codice client più complesso. Le specifiche supportano eventi denominati (eventi relativi a un particolare argomento), che a mio avviso suggeriscono che una connessione Eventi-Server inviati debba essere utilizzata come singolo canale per tutti gli eventi.Dovrebbe esserci un solo oggetto EventSource per app?
Il codice seguente illustra il primo scenario in cui vengono avviate a connessioni multiple Event Server-Sent:
var EventSource eventSource1 = new EventSource("events/topic1");
eventSource1.addEventListener('topic1', topic1Listener, false);
var EventSource eventSource2 = new EventSource("events/topic2");
eventSource2.addEventListener('topic2', topic2Listener, false);
eventSource1 riceverebbe eventi "TOPIC1" e eventSource2 riceverebbe eventi "TOPIC2". Anche se questo è piuttosto semplice, è anche abbastanza inefficiente con un pensile GET che si verificano per ogni argomento che ti interessa
L'alternativa è qualcosa di simile al seguente:.
var EventSource eventSource3 = new EventSource("/events?id=1234")
eventSource3.addEventListener('topic3', topic3Listener, false);
eventSource3.addEventListener('topic4', topic4Listener, false);
var subscription = new XMLHttpRequest();
subscription.open("PUT", "/events/topic3?id=1234", true);
subscription.send();
In questo esempio un singolo EventSource farebbe l'esistenza e l'interesse in un particolare evento sarebbero specificati da una richiesta separata con la connessione Event-Server-Sent e la registrazione essendo correlata dal parametro id. topic3Listener riceverebbe eventi "topic3" e topic4Listener non lo farebbe. Pur richiedendo un numero leggermente maggiore di codice, il vantaggio è che viene effettuata una sola connessione, ma gli eventi possono ancora essere identificati e gestiti in modo diverso.
Ci sono alcuni esempi sul web che mostrano l'uso di eventi con nome, ma sembra che i nomi degli eventi (o argomenti) siano noti in anticipo quindi non è necessario che un client registri interessi con il server (example). Anche se devo ancora vedere un esempio che mostra più oggetti EventSource, non ho visto nemmeno un esempio che mostra un client che utilizza una richiesta separata per registrare l'interesse in un particolare argomento, come sto facendo sopra. La mia interpretazione delle specifiche mi porta a credere che indicare un interesse per un determinato argomento (o nome di un evento) sia interamente a carico dello sviluppatore e che possa essere fatto staticamente con il cliente conoscendo i nomi degli eventi che sta per ricevere o in modo dinamico con il client che avvisa il server che è interessato a ricevere eventi particolari.
Sarei molto interessato ad ascoltare i pensieri di altre persone sull'argomento. NB: Di solito sono un dev di Java quindi per favore perdonami il mio mediocre codice JS .. :)
non si può utilizzare a tutti i nomi degli eventi nel vostro evento-stream, invece è possibile ascoltare per l'evento "messaggio" e nel event.data è possibile codificare il TopicId e informazioni aggiuntive – 4esn0k
Sì certo, ma ciò significherebbe che ho bisogno di codificare tali dati nel carico utile che non ha realmente senso quando l'identificazione del messaggio fa già parte dell'inquadratura dei dati della specifica. –
+1! ottima domanda. Cosa hai finito? Sto anche pensando di andare con il secondo approccio. Apprezzeremmo se condividessi se hai avuto problemi con esso. – brainOverflow