Design pattern per socket.io ed Express

3

Ho un server HTTP RESTful Node.js Express Chiamerò il server A e un server express.io Express Chiamerò il server B.

Il server A risponde a tutte le richieste HTTP dei client e il server B ascolta l'oplog MongoDB e invia gli aggiornamenti del database attualmente a tutti client.

Non voglio inviare tutti gli aggiornamenti del DB a tutti i client -Voglio ottimizzare il sistema in modo che il server B e i client connessi subiscano meno carichi dal partizionamento del server B in modo che solo alcuni / Gli aggiornamenti DB rilevanti vengono inviati a determinati client ... In questo modo il server B potrebbe inviare solo una frazione dei messaggi che avrebbe prima e ogni client non dovrà gestire tutti gli aggiornamenti.

Ho letto un po 'su socket.io rooms e su come i client possono unirsi a uno spazio dei nomi.

In passato ho aggiunto l'id utente a tutte le raccolte MongoDB che appartengono a un determinato utente, quindi potrei avere ogni client unirsi allo spazio dei nomi indicato dal loro id utente.

Questo potrebbe significare che ogni client ottiene solo gli aggiornamenti corrispondenti al proprio spazio dei nomi sul server + alcuni aggiornamenti universali che riguardano tutti gli utenti.

La mia domanda è come progettarla al meglio in modo che tutti gli utenti ottengano gli aggiornamenti di cui hanno bisogno riducendo al minimo il carico sul server e sui client.

Qualcuno ha qualche consiglio su come farlo al meglio con MongoDB, l'oplog MongoDB e un server socket.io separato?

    
posta Alexander Mills 24.08.2015 - 03:39
fonte

1 risposta

1

Anche se l'hai chiesto un anno fa, ho una soluzione! Uno che potrebbe essere utile se stai ancora usando socket.io

Ehi ho trovato questo preciso problema durante la creazione di un'applicazione di condivisione di haiku (puoi verificarlo al link )

Puoi vedere il mio codice sorgente ospitato su github all'indirizzo link

Controlla il codice per index.js link

sulla riga 95 c'è il seguente codice:

clients[clients.indexOf(socket)].emit('load_haiku_from_cache', a_latest_haiku);

In sostanza, quando un nuovo utente si connette, voglio caricare la cache di haiku che sono archiviati nella RAM sull'app nodo in una variabile chiamata haiku_cache o qualcosa del genere. Ce ne sono 7 nella cache e vengono emessi quando un utente si connette di recente.

Tuttavia, è diverso perché ora se un nuovo utente, ad esempio l'utente 2 si connette, l'utente 1 otterrebbe (di norma) un doppio aggiornamento della cache nel proprio feed di spurie socket.

Quindi, il codice sopra riportato emette efficacemente informazioni lungo uno specifico socket.

In conclusione, ti consiglio di tenere traccia di tutte le prese che desideri ricevere un particolare set di informazioni, e quindi utilizzare la linea sopra descritta per inviare a socket specifici. È possibile emettere attraverso il cavo / sul socket per uno specifico client connesso, il che è molto bello, utilizzando la linea sopra.

Spero che aiuti chiunque cerchi una buona soluzione per "come emettere su un sottoinsieme di colleghi connessi" dal momento che il gruppo / room socket.io è un po 'disordinato.

    
risposta data 30.09.2016 - 01:47
fonte

Leggi altre domande sui tag