2017-03-13 62 views
7

Socket based event push architecture Mam aplikacji serwera gniazdo napisane na js węźle hostowane na Amazon EBS (Elastic fasoli łodygi), który jest zarządzany przez load balancerGniazdo IO na ELB, konieczne jest podłączenie do wszystkich instancji serwerów aplikacyjnych

Klienci łączy się z gniazdem i przekazuje określony identyfikator, na przykład event_id, moja aplikacja tworzy pomieszczenie o nazwie "event_ event_id" i dołącz do pokoju. Różni klienci mają różne „event_id”

Funkcja lambda podłącza się do gniazda i emituje zdarzenie o nazwie „event_push” do wniosku wraz z niezbędnymi danymi, takimi jak event_id

Ilekroć mój wniosek gniazdo (w jednym z przypadków, w EBS) wykrywa zdarzenie pchania event_id, to nadawanie popychane danych dla wszystkich członków pokoju „event_ event_id”, a więc wszyscy członkowie zostaje powiadomiony o wypadku

klienci mogą łączyć jednego z serwerów, postanowił przez równoważenia obciążenia i sesje lepkie mogą utrzymać połączenie

Teraz mój problem: Czy istnieje sposób, aby emitować „event_push” tylko do serwera posiadającego salę o nazwie „event_ event_id

Qn: Czy istnieje sposób, aby emitować zdarzenia do wszystkich instancji serwerów w EBS? LUB Qn: Czy istnieją alternatywne rozwiązania?

+0

Możliwe rozwiązanie: Centralny serwer subskrypcji/publikowania, który może mieć trwałe połączenie, które może odbierać szczegóły wydarzenia. Serwery gniazd mogą zasubskrybować centralny serwer, tak aby kiedykolwiek zdarzyło się zdarzenie, zostanie przekazane do wszystkich subskrybowanych serwerów gniazd przez trwałe połączenie. – Ima

Odpowiedz

0

Co możesz zrobić, to możesz użyć Redis lub mongoDb do zapisania pewnych informacji w twoim przypadku event_event_id. Można zapisać te informacje w pamięci danych, na przykład próbki doc

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

co teraz będzie to zrobić, to będziesz miał informacje, że zdarzenie, które należy do którego serwera. Teraz jeśli loadbalancer wyśle ​​żądanie serwera 1 do serwera 2, a serwer 2 nie rozpozna tego żądania, możesz utworzyć kanał komunikacyjny między serwerami (możesz użyć socketio, microservice lub cokolwiek innego) i przekierować to żądanie do serwera 1, aby mógł uruchomić to konkretne gniazdo zdarzenie.

Musisz usunąć identyfikator gniazda z mongo lub redis po wywołaniu zdarzenia rozłączenia.

+0

1. Moje serwery zaczynają się od Elastic Bean Stalk, nigdy nie wiadomo, który serwer jest uruchomiony, który serwer jest wyłączony lub kiedy zainicjowano nowy serwer. Tak więc komunikacja między serwerami nie wchodzi w grę w tym scenariuszu. – Ima

+0

2. Nigdy nie dowiesz się, który użytkownik jest podłączony do którego serwera, chodzi o połączenie gniazda z przeglądarki do serwera, połączenie jest trwałe, a klient (przeglądarki) nie może nawiązać połączenia z określonym serwerem z dwóch powodów. a) Serwery nie zawsze się pojawiają, ale zarządzane przez EBS i klienta (przeglądarki) nie mają żadnych informacji o serwerach. b) Połączenie jest określane przez Elastic Load Balancer (ELB). – Ima

+0

Zdarzenia nie są ograniczone do żadnego użytkownika ani żadnego innego podmiotu, więc nie mogę zrobić powiązania, jak zasugerowałeś. – Ima