Node.js, Socket.io, Redis pub / sub duża objętość, trudności z niskim opóźnieniem

Łącząc socket.io/node.js i redis pub / sub w celu stworzenia systemu transmisji internetowej w czasie rzeczywistym sterowanego zdarzeniami serwera, które mogą obsługiwać wiele transportów, wydaje się, że istnieją trzy podejścia:

'createClient' to połączenie redis i subskrybuj kanał (y). W połączeniu z klientem socket.io przyłącz klienta do pokoju socket.io. W zdarzeniu redis.on („wiadomość”, ...) wywołaj io.sockets.in (pokój) .emit („zdarzenie”, dane), aby rozesłać je do wszystkich klientów w odpowiednim pomieszczeniu. LubićJak ponownie wykorzystać połączenie redis w socket.io?

'createClient' to połączenie redis. W połączeniu z klientem socket.io przyłącz klienta do pokoju socket.io i zasubskrybuj odpowiednie kanały redis. Dołącz redis.on („wiadomość”, ...) do zamknięcia połączenia klienta i po otrzymaniu wiadomości call.emit („zdarzenie”, dane) podnieś zdarzenie na konkretnym kliencie. Jak odpowiedź wPrzykłady użycia RedisStore w socket.io

Użyj RedisStore upieczonego w socket.io i „broadcast” z pojedynczego kanału „dispatch” w Redis, zgodnie z protokołem socketio-spec.

Numer 1 pozwala obsługiwać subwoofer Redis i powiązane zdarzenie raz dla wszystkich klientów. Numer 2 oferuje bardziej bezpośredni hak w pubie / sub Redis. Numer 3 jest prostszy, ale oferuje niewielką kontrolę nad zdarzeniami przesyłania wiadomości.

Jednak w moich testach wszystkie wykazują nieoczekiwanie niską wydajność z więcej niż 1 połączonym klientem. Zdarzenia serwera, o których mowa, to 1000 wiadomości opublikowanych w kanale redis tak szybko, jak to możliwe, aby zostały rozprowadzone tak szybko jak to możliwe. Wydajność jest mierzona przez czasy na podłączonych klientach (w oparciu o socket.io-client, które rejestrują znaczniki czasu na liście Redis do analizy).

Przypuszczam, że w opcji 1 serwer odbiera wiadomość, a następnie zapisuje ją sekwencyjnie wszystkim połączonym klientom. W opcji 2 serwer odbiera każdą wiadomość wielokrotnie (raz na subskrypcję klienta) i zapisuje ją do odpowiedniego klienta. W obu przypadkach serwer nie dotrze do drugiego zdarzenia wiadomości, dopóki nie zostanie przekazany do wszystkich połączonych klientów. Sytuacja wyraźnie zaostrzona przy rosnącej współbieżności.

Wydaje się to sprzeczne z postrzeganą mądrością możliwości stosów. Chcę wierzyć, ale walczę.

Czy ten scenariusz (rozkład małych opóźnień dużej ilości wiadomości) nie jest opcją w przypadku tych narzędzi (jeszcze?), Czy też brakuje mi triku?

questionAnswers(1)

yourAnswerToTheQuestion