2014-11-28 20 views
11

Chciałbym zaimplementować jakiś serwer czatu. I chcę go skalować. Wydaje się, że to wielkie pytanie, więc myślę, że spodziewam się, że odpowiedzi będą kierunkowymi wskazówkami, rodzaj eksploracji.Strategia wdrożenia skalowalnego serwera czatowego

Klientami końcowymi są klient sieci lub telefon. Myślę, że jakaś implementacja websocket, taka jak Socket.IO, jest fajna.

Po stronie serwera chcę użyć Node.js. Chcę, aby architektura była skalowalna, aby liczba użytkowników nie była ograniczona (dobrze, w granicach rozsądku, szansa na duże trafienie nie jest oczekiwana, a jeśli tak, to szansa na to, aby mądrzejsi, doświadczeni ludzie mogli na niej pracować, jest rozsądna zamiast obecnie tylko kodowania) liczba użytkowników na czacie ma nadzieję, że nie jest ograniczona, lub może niektóre stałe dużą liczbę. Oznacza to, że muszę skalować w poziomie, używając kilku serwerów napisanych w węźle.

Załóżmy, że niektóre load balancer (i mam nadzieję, że w przyszłości nie będzie ani jednego punktu awarii, ale nie wiem, jak to osiągnąć, lub może po prostu przenieść się do AWS) wysyłają połączenia SocketIO od klientów końcowych do serwery czatu. Połączenie różnych użytkowników z różnymi serwerami może znajdować się w tym samym pomieszczeniu, więc wiadomości muszą być wysyłane do innych serwerów.

Jak mógłbym zrealizować coś takiego? Mam nadzieję, że nie jest zbyt skomplikowany.

Pytania: (1) Jeśli wszystkie serwery muszą obsługiwać wszystkie wiadomości, ponieważ użytkownicy mogą być zalogowani przez jeden z serwerów, czy ta skala? (2) Czy potrzebuję jakiejś kolejki wiadomości, aby serwery mogły między nimi rozmawiać? Czy Pub-sub z Rabbitmq nadaje się do tego? Lub, jeśli zera, w jaki sposób skalowałbym się z subem pub? Przewodnik Zeromq zawiera wyjaśnienia dotyczące skalowania do więcej niż jednego serwera z aplikacjami typu REQ/REP. Ale nie Pub Sub. (3) Czy powinienem zacząć od XMPP?

Mam nadzieję, że sprawię, że będzie to tak łatwe, jak to tylko możliwe.

Odpowiedz

8

Na stronie Socket.io jest dość dobre wytłumaczenie. Wystarczy popatrzeć na

Sugeruje użyciu Nginx jako równoważenia obciążenia HTTP, node.js klastrów (z sesji lepkie) i Redis jako backend wiadomości.

Myślę, że twoje cele powinny być osiągalne przy niewielkim lub żadnym kodowaniu, tylko przy użyciu danych modułów i mechanizmów konfiguracji.

+0

Tak, redis jest jak MQ w tym przypadku. – huggie

+0

Tak, obsługuje on PUB/SUB: http://redis.io/topics/pubsub – Tobi

+0

Czy masz jakiś pomysł, jeśli chcę, aby wiadomości na czacie były przesyłane do MongoDB, w jaki sposób mogę to osiągnąć? Jeśli mam jeden serwer Node.js, który subskrybuje wszystko i po prostu loguje się do MongoDB, to nie wydaje się skalowalny. Ale jeśli mam dwa, nagrałbym to ... dwa razy? – huggie