2015-02-08 16 views
11

Sono coinvolto in un progetto di sviluppo di una chat in cui stiamo utilizzando node.js, socket.io (stanze) e mongodb. Siamo nella fase di test delle prestazioni e siamo molto preoccupati se il sistema necessita di un bilanciamento del carico.Progetto chat - bilanciamento carico con socket.io

Come possiamo sviluppare se il nostro progetto ne ha bisogno? J'a ricercato su NGINX sembra interessante, ma siamo in dubbio se risolve il nostro problema di come il sistema sarà una chat, temiamo che i server non stiano parlando ~ tra loro correttamente ...

Dove siamo andare se abbiamo bisogno di un bilanciamento del carico?

risposta

9

Per garantire la scalabilità su più nodi ma mantenere l'interconnessione tra client diversi e server diversi, utilizzo redis. In realtà è molto semplice da usare e configurare.

Ciò che fa è creare un pub/sottosistema tra i server per tenere traccia dei diversi client socket.

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})}); 

Read more here: socket.io-redis

Per quanto riguarda la gestione dei server diversi nodi, ci sono diversi approcci.

  • AWS ELB (elastico di bilanciamento del carico)
  • Nginx
  • Apache
  • HAProxy

Tra gli altri ...

+0

Come posso usare AWS ELB? – Ren4n

+0

Cosa devo fare per configurare il server redis? – Ren4n

+0

per utilizzare AWS ELB, è necessario un account AWS in cui si ospitano i server. È possibile inoltrare le porte tramite l'ELB ai diversi server. È molto bello. Per quanto riguarda la configurazione di Redis, è così facile da configurare. È praticamente plug and play. Avere su un server centrale che è protetto da firewall con gli altri server. –

3

Controllare il pacchetto NPM mong.socket.io. Ha la capacità di salvare i dati di socket.io in mongoDB come di seguito;

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

Oppure è possibile utilizzare l'adattatore redis come indicato di seguito;

Socket.IO Using multiple nodes

poi basta usare il proxy inverso Nginx e tutti i processi nodo dovrebbe condividere eventi Socket.IO con l'altro.

Problemi correlati