2015-02-08 44 views
11

我參與了一個聊天的開發項目,我們正在使用node.js,socket.io(房間)和mongodb。我們正處於性能測試階段,我們非常擔心繫統是否需要負載均衡。聊天項目 - 使用socket.io負載平衡

如果我們的項目需要它,我們該如何開發? J'a關於NGINX的研究看起來很酷,但我們懷疑是否解決了我們的問題,因爲系統會如何聊天,我們擔心服務器不能正確地與對方說話......

我們在哪裏如果我們需要負載平衡,那就去吧?

回答

9

爲了確保我們可以擴展到多個節點,但保持不同客戶端和不同服務器之間的互連,我使用redis。它的使用和設置實際上非常簡單。

這樣做會在您的服務器之間創建一個pub/sub系統來跟蹤您的不同套接字客戶端。

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

在這裏閱讀更多:socket.io-redis

至於處理不同節點的服務器,也有不同的做法。

  • AWS ELB(彈性負載均衡器)
  • Nginx的
  • 阿帕奇
  • HAProxy的

在其他...

+0

我如何使用AWS ELB? – Ren4n 2015-02-14 03:55:28

+0

我需要做些什麼來配置redis服務器? – Ren4n 2015-02-14 04:29:57

+0

爲了使用AWS ELB,您需要一個您正在託管服務器的AWS賬戶。您可以通過ELB將端口轉發到不同的服務器。它太酷了。就Redis配置而言,這非常容易設置。這幾乎是即插即用。將它放在與其他服務器防火的中央服務器上。 – 2015-02-14 21:50:03

3

查看NPM包mong.socket.io。它可以像下面一樣將socket.io數據保存到mongoDB;

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

或者您可以使用上面提到的redis適配器;

Socket.IO Using multiple nodes

然後,只需使用nginx的反向代理,所有的節點過程應該互相共享Socket.IO事件。