2013-08-07 7 views
13

Jest kilka pytań na ten temat, ale żaden z nich nie rozwiązuje problemu.Scaling Engine.IO ze sklepem Redis (w porównaniu z Socket.IO)

Używam Socket.IO z magazynem redis i przygotowuję się do uderzenia w ruch. Moja firma hostingowa powiedziała: "Musisz używać Engine.IO zamiast Socket.IO, ponieważ jest to o wiele bardziej wydajne", więc staram się zrozumieć, co to oznacza.

Questions like this mieć pozornie sprzecznych odpowiedzi:

Tak jak ja to widzę:

  • Socket.IO 0,9 degraduje
  • Engine.IO zwiększa
  • Socket.IO 1.0 użyje Engine.IO
  • Jeśli chcesz uruchomić Engine.IO w wielu przypadkach trzeba napisać Redis zapisać sobie

Ale wtedy Engine.IO mówi, że jest "przyjazny dla load balancer", ale nie mówi nic o Redis. Musi mieć jakiś zewnętrzny sklep, prawda? Ale jeśli ma wiele transportów i sklep, jaki jest sens Socket.IO?

Następnie widzę, że Socket.IO might be abandoned i high profile companies are moving na Primus.

Jak mogę skalować Engine.IO? Czy muszę sam pisać sklep?

+0

Jeśli pójdziesz z Engine.IO, tak trzeba będzie napisać własny sklep. Wiem, że nie jest fajnie narzekać na brak aktualizacji na temat projektów open source, ale mam wrażenie, że rzuciły piłkę na Socket.IO. Wokół takich pytań krąży wiele pytań, a 1.0 już od ponad pół roku jest tuż za rogiem. Istnieją setki otwartych problemów, które mają wiele miesięcy na socket.io, więc daje wszystkie pozory bycia bez opieki w tym momencie. –

+0

Jeśli chcesz użyć engine.io, to musisz napisać dodatkowe rzeczy. Wyobrażam sobie, że socket.io stoi w obliczu niektórych blokad drogowych dostosowujących się do nowego rdzenia. Socket.io jest do engine.io, co wyrazić, aby połączyć. Ukrywa on szczegóły niskiego poziomu silnika.io i jest elastyczny i przyjazny dla użytkownika. Ale prosiłbym, żebyś nie budował na nim sklepu, z tego samego powodu. socket.io 1.0 został zbudowany na obietnicy engine.io. Biorąc pod uwagę status socket.io 1.0, każdy może zagwarantować, że engine.io odniesie sukces. Jeśli oczekuje się na 1.0, to będzie lepsze niż to, co możesz zrobić, jeśli nadejdzie. – user568109

Odpowiedz

-1

Cóż, jak wspomniałeś o sobie, powinienem rzucić okiem na Primusa. Skalowanie osiąga się za pomocą HAProxy. Jako podstawową komunikację nadal możesz używać Socket.io, ale także engine.io. Korzystając z Primusa, możesz eksperymentować z różnymi bibliotekami. Istnieje interesujący artykuł na temat skalowania Redis pod numerem http://pusher.com/docs/server_libraries.

+0

Należy pamiętać, że HAProxy zaleca stosowanie lepkich sesji, co oznacza, że ​​powinien zawsze przekierowywać kogoś z tą samą sesją do tego samego komputera. Czyni to zamiast wspólnego magazynu informacji o połączeniu. Jest kilka zalet i wad dla każdego podejścia, więc upewnij się, że rozumiesz je przed podjęciem decyzji o skakaniu. http://stackoverflow.com/questions/1553645/pros-and-cons-of-sticky-session-session-affinity-load-blancing-strategy –

+0

Nie zdecydowałem. Próbowałem tylko pomóc i wskazałem OP na jakieś artykuły napisane przez kogoś innego. Dzięki za obniżenie oceny. –

+0

Wiem. To było przeznaczone dla OP. –

10

Chciałam podzielić się tym, czego się nauczyłam w zeszłym tygodniu, ale mam nadzieję, że pojawi się ktoś inny i odpowie na nie definitywnie, więc mogę dać im czek.

1) Nigdy nie używać Socket.IO (od 0.9.16)

Mój gospodarz słusznie powiedzieć, aby korzystać Engine.IO (lub czegokolwiek innego). Socket.IO ma ogromną liczbę poważnych problemów, z których najgorsze jest to, że niespodziewanie będzie to DDoS your server. Doświadczyłem tego pierwszego rozdania z relatywnie niewielką liczbą klientów i całkowicie zablokowałem mój serwer, dopóki nie mogłem przepisać Socket.IO. Przeskoczyłem do 25+ dronów, aby zaabsorbować cios i nie miało to znaczenia. Pojedynczy klient może wysłać 1000 żądań na sekundę.

2) Inne Silniki not Have Redis Stores

Socket.IO pozwala Ci transmisje w węzłach przez upuszczenie ich Redis sklepie. O ile mogę powiedzieć, Engine.IO, Primus i SockJS nie oferują tego.Więc kiedy te silniki twierdzą, że "load balancer" jest przyjazny, nie oznacza to, że możesz transmitować w różnych węzłach. Zaczynam myśleć, że to naprawdę dobra rzecz. Pisanie pub/sub z redis jest stosunkowo łatwe, a oddzielenie go jest miłe.

Skończyło się na użyciu Primus z Engine.IO, a następnie używane redis pub/sub do udostępniania wydarzeń między węzłami. Usunięcie Socket.IO zajęło mi około 5 godzin, podłącz Primusa, napisz pub/sub i uruchom transmisję. Jak dotąd było to znacznie lepsze doświadczenie.

UPDATE:

Kończy się Engine.IO wystąpią również w RECONNECT pętli (kilka na sekundę), więc ostatecznie wykorzystane SockJS. Daje mi najlepszą łączność, stabilność i & (której SockJS nie robi).

+0

Hej teraz, kiedy przełączyłeś się z silnika na sockjs, czy redis pub/sub nadal działa tak samo? Nadal możesz skalować za pomocą redis? – Harry

+1

Aby być czystym, pub/sub Redis nie jest wbudowany w engineio lub sockjs. Podłączyłem się do redis zupełnie niezależnie. Ponieważ używam Primusa, przełączanie nie zmieniło wcale elementu Redis. – bendytree

+0

Dlaczego nie używać Primus + Redis pub/sub i dodać warstwę SockJs? – hfcorriez

1

Zgadzam się, że Socket.IO należy unikać, dopóki nie zostanie wydany v1.0, jest on wadliwy iw moich testach Engine.IO wypadł lepiej (https://medium.com/node-js-javascript/b63bfca0539). Primus jest zdecydowanie dobrym rozwiązaniem: może użyjesz Engine.IO teraz, ale kiedy Socket.IO 1.0 zostanie wydany, będziesz chciał go przełączyć.

Zaimplementowałem podobny program z Engine.IO i strukturą Redis i Pub/Sub, wygląda bardzo elegancko. Poniższy kod subskrybuje podłączonego klienta do pokoju/kanału.

io.on('connection', function (socket) { 
    var observerRedisClient = redis.createClient(); 
    observerRedisClient.subscribe(resourceId, redis.print); 

    observerRedisClient.on('message', function(channel, message) { 
     socket.send(message); 
    }); 
}); 

A jeśli zaktualizujesz ten kanał, np. zapisz niektóre dane i opublikuj je, a następnie otrzymają wszyscy subskrybenci.

redisClient.set(key, value, redis.print); 
redisClient.publish(key, value); 

Jeśli jesteś zainteresowany kod jest open source: https://github.com/denizozger/node-engine.io-server