2015-02-08 11 views
11

Jestem zaangażowany w projekt rozwoju czatu, w którym używamy node.js, socket.io (rooms) i mongodb. Jesteśmy na etapie testowania wydajności i jesteśmy bardzo zainteresowani, jeśli system potrzebuje równowagi obciążenia.Projekt czatu - bilans obciążenia z socket.io

Jak możemy się rozwijać, jeśli nasz projekt tego wymaga? J'a badane na NGINX wygląda fajnie, ale mamy wątpliwości, czy rozwiązuje nasz problem, jak system będzie czatować, boimy się, że serwery nie rozmawiają ze sobą poprawnie ...

Gdzie jesteśmy Idź, czy potrzebujemy równoważenia obciążenia?

Odpowiedz

9

Aby zapewnić, że możemy skalować do wielu węzłów, ale utrzymywać połączenia między różnymi klientami i różnymi serwerami, używam redis. Jest bardzo prosty w użyciu i konfiguracji.

To, co robi, tworzy system pub/sub pomiędzy serwerami, aby śledzić różnych klientów gniazd.

var io = require('socket.io')(3000), 
    redis = require('redis'), 
    redisAdapter = require('socket.io-redis'), 
    port = 6379, 
    host = '127.0.0.1', 
    pub = redis.createClient(port, host), 
    sub = redis.createClient(port, host, {detect_buffers: true}), 
    server = http(), 
    socketServer = io(server, {adapter: redisAdapter({pubClient: pub, subClient: sub})}); 

czytaj więcej tutaj: socket.io-redis

W miarę postępowania z różnych serwerów węzła, istnieją różne podejścia.

  • AWS ELB (elastyczna równoważenia obciążenia)
  • Nginx
  • Apache
  • HAProxy

Między innymi ...

+0

Jak mogę używać AWS ELB? – Ren4n

+0

Co muszę zrobić, aby skonfigurować serwer redis? – Ren4n

+0

Aby korzystać z AWS ELB, potrzebujesz konta AWS, na którym hostujesz swoje serwery. Możesz przekazywać swoje porty przez ELB do różnych serwerów. To całkiem fajne. Jeśli chodzi o konfigurację Redis, to jest to łatwe do skonfigurowania. To praktycznie plug-and-play. Miej go na centralnym serwerze, który jest zaporę ogniową z Twoimi innymi serwerami. –

3

Sprawdź pakiet NPM mong.socket.io. Ma możliwość zapisania danych socket.io na mongoDB jak poniżej;

{ 
    "_id" : ObjectId("54b901332e2f73f5594c6267"), 
    "event" : "join", 
    "message" : { 
      "name" : "join", 
      "nodeId" : 426506139219, 
      "args" : "[\"URAiA6mO6VbCwquWKH0U\",\"/54b6821asdf66asdasd2f0f9cd2997413780273376\"]" 
    }} 

Można również użyć adaptera redis, o którym wspomniano;

Socket.IO Using multiple nodes

Następnie wystarczy użyć Nginx reverse proxy i wszystkie procesy węzłów powinny dzielić wydarzenia Socket.IO ze sobą.