recapita il messaggio al client websocket connesso tramite il servizio di bilanciamento del carico

1

Il problema

Ho un numero di client connessi via websocket a nodes della mia applicazione web attraverso un load balancer. Ciò di cui ho bisogno è di fornire notifiche per utente.

La mia idea

La mia idea è di avere ogni nodo dell'applicazione web connesso a un sistema di messaggistica (RabbitMQ, Apache Kafka) e fare in modo che ogni nodo crei una coda (ad esempio "node1-queue") e quindi di avere un sistema di pubblicazione dei messaggi che sia consapevole della relazione user -> queue.

Ora, questo sembra un grosso problema, mi chiedo se lo sono, reinventando la ruota e se qualche framework fornisce già questa funzionalità fuori dalla scatola.

    
posta Piero Nadello 02.08.2016 - 12:13
fonte

1 risposta

1

Perché non trasmettere semplicemente il messaggio a tutti i nodi e poi lasciare che i nodi scelgano i messaggi che vogliono inoltrare tramite WebSockets ai client?

Se hai molto di messaggi (tanto che l'impatto sulla rete diventa evidente), usare l'ID utente nella chiave di routing potrebbe essere il modo più semplice per ridurre il traffico tra MQS e i nodi.

Immagina di avere un'applicazione di chat con stanze e utenti. Utilizzando uno scambio di argomenti , puoi utilizzare le chiavi di routing come chat.room123.user456 quando trasmetti un messaggio di utente 456 pubblicato nella stanza 123. Puoi consumare quei messaggi avendo una coda con una chiave di associazione chat.room123.* , che ascolterà tutti i messaggi in una stanza specifica. Potresti anche voler consumare i messaggi inviati da un utente specifico, indipendentemente dalla stanza, utilizzando la chiave di associazione chat.*.user456 . Per ridimensionarlo, potresti avere alcuni server che gestiscono alcune stanze e altri server che gestiscono alcuni utenti. Ad esempio, un determinato server può avere connessioni WebSockets per gli utenti 17, 41 e 48 e avere le chiavi di associazione chat.*.user17 , chat.*.user41 e chat.*.user48 .

La parte difficile qui potrebbe essere la gestione del caso in cui la connessione WebSockets viene interrotta e il client si riconnette a un nodo diverso. Le sessioni persistenti potrebbero risolvere questo problema. A parte questo, la gestione degli errori e la perdita della connessione WebSockets non è diversa da qualsiasi altro scenario in cui i messaggi da un servizio di raccolta messaggi dovrebbero essere preelaborati e inviati a una terza parte.

    
risposta data 02.08.2016 - 12:39
fonte

Leggi altre domande sui tag