2017-03-13 5 views
7

Socket based event push architecture Ich habe eine Socket-Server-Anwendung geschrieben am Knoten js, gehostet auf Amazon EBS (Elastic Bohnenstiel) verbinden, die durch Load-BalancerSockel io auf ELB, müssen alle Instanzen von Anwendungsservern

Clients verwaltet verbindet sich mit dem Socket und übergeben angegebene ID, sagen event_id meine Anwendung erstellt Raum mit dem Namen "event_ event_id" und dem Raum beitreten. Unterschiedliche Kunden haben unterschiedliche „event_id“

Eine Lambda-Funktion an die Buchse angeschlossen und sendet ein Ereignis mit dem Namen „event_push“, um die Anwendung mit den erforderlichen Daten wie event_id

Immer, wenn meine Socket-Anwendung (in einem der Fälle, in EBS) eine Push-Ereignis mit event_id erfasst, übertragen sie die geschoben Daten an alle Mitglieder des Raumes „event_ event_id“, also alle Mitglieder der Veranstaltung

Kunden durch Load-Balancer, einen der Server eine Verbindung herstellen können, entschieden informiert wird, und Sticky-Sitzungen können die Verbindung aufrechterhalten

Nun mein Problem: Gibt es eine Möglichkeit, die „event_push“, um nur den Server sende einen Raum namens „event_ event_id

Qn mit: eine Möglichkeit, ein Ereignis für alle Instanzen des Servers zu emittieren Gibt es in EBS? ODER Qn: Gibt es alternative Lösungen?

+0

Mögliche Lösung: Ein zentraler Subscribe/Publish-Server, der dauerhafte Verbindung haben kann, die die Ereignisdetails empfangen kann. Die Socket-Server können den zentralen Server abonnieren, so dass sie bei jedem Ereignis über die dauerhafte Verbindung an alle abonnierten Socket-Server gesendet werden. – Ima

Antwort

0

Sie können Redis oder mongoDb verwenden, um einige Informationen in Ihrem Fall event_event_id zu speichern. Sie können zum Beispiel Probe doc

{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 1 
}, 
{ 
    _id : ObjectId, 
    userId : 23, 
    event : event_event_id, 
    server : 2 
} 

nun diese Informationen in einem Datenspeicher speichern, was wird dies tun, ist, dass Sie die Informationen haben, dass die Veranstaltung auf dem Server gehört. Wenn Loadbalancer die Anfrage von Server1 an Server 2 sendet und Server 2 diese Anfrage nicht erkennt, können Sie einen Kommunikationskanal zwischen den Servern erstellen (Sie können socketio, microservice oder irgendetwas verwenden) und diese Anfrage an Server 1 weiterleiten, so dass sie diesen bestimmten Socket auslösen kann Veranstaltung.

Sie müssen die Socket-ID von Mongo oder redis löschen, wenn das Ereignis disconnect ausgelöst wird.

+0

1. Meine Server werden von Elastic Bean Stalk gestartet, Sie werden nie wissen, welcher Server aktiv ist und welcher Server ausgefallen ist oder wann ein neuer Server initialisiert wird. In diesem Szenario kommt also die Kommunikation zwischen Servern nicht in Frage. – Ima

+0

2. Sie werden nie wissen, welcher Benutzer mit welchem ​​Server verbunden ist, es geht um Socket-Verbindung vom Browser zum Server, die Verbindung ist persistent und der Client (Browser) kann aus zwei Gründen keine Verbindung zu einem bestimmten Server herstellen. a) Die Server sind nicht immer erreichbar, sondern von EBS verwaltet und der Client (Browser) hat keine Informationen über die Server. b) Die Verbindung wird von Elastic Load Balancer (ELB) bestimmt. – Ima

+0

Auch Ereignisse sind nicht auf einen Benutzer oder eine andere Entität beschränkt. Daher kann ich keine verbindlichen Anweisungen geben. – Ima