2015-09-28 52 views
1

我必须使用websocket实现聊天应用程序,用户将通过组聊天,可以有数千个组,并且用户可以处于多个组中。我在考虑2个解决方案:Websocket最佳实践组群聊天/一个websocket为所有组或一组websocket每组?

[1]对于每个群聊,我创建一个websocket端点(使用camel-atmosphere-websocket),同一群组中的用户可以订阅群端点和发送/接收消息在那个端点上。这意味着可以有数千个websocket端点。客户端(比方说iPhone)必须订阅多个wbesocket端点。这是一个很好的做法吗?

[2]我只为所有组创建一个websocket端点。客户端只是订阅这个端点,我自己管理服务器上的消息分发:获取组成员,从连接的websocket列表中选择每个成员的websocket,然后通过websocket将消息写入每个成员。

哪种解决方案在性能方面更好,并且易于在客户端和服务器上实现?

谢谢。


编辑2015年10月6日

我选择了第二种方法,并做了与码头的WebSocket客户端的测试,我用骆驼气氛WebSocket的服务器端。在客户端,我创建websocket连接到服务器的线程。码头有一个问题,我可以创建大约160个websocket连接(这意味着大约160个线程)。结果是,当客户端数量从1增加到160时,我几乎看不到什么区别。

是的,160并不是一个大数字,但我认为当我看到性能问题时,我会做更多的测试,现在,我确定第二种方法。

如果你有兴趣的测试代码,那就是: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html#d0e22545

回答

4

我认为第二种方法会更好使用性能。我使用的是我的应用程序,但它仍处于测试阶段,因此无法评论实时性能。现在它运行10-15组,并正常工作。在我的应用程序中,有类似的情况,用户可以根据组进行聊天。我正在使用node.js处理服务器端的组创建。这里是创建组的代码,但它是针对我的应用程序的特定情况。只是粘贴在这里供参考。从前端获取homeStateuserId。根据homeState创建组。这个代码只是例如,它不适合你。要提高性能,您可以使用clustering

this.ConnectionObject = function(homeState, userId, ws) { 
      this.homeState = homeState; 
      this.userId = userId; 
      this.wsConnection = ws; 
     }, 

     this.createConnectionEntry = function(homeState, userId, 
       ws) { 

      var connObject = new ws.thisRefer.ConnectionObject(homeState, userId, 
        ws); 
      var connectionEntryList = null; 
      if (ws.thisRefer.connectionMap[homeState] != undefined) { 
       connectionEntryList = ws.thisRefer.connectionMap[homeState]; 
      } else { 
       connectionEntryList = new Array(); 
      } 
      connectionEntryList.push(connObject); 

      console.log(connectionEntryList.length); 

      ws.thisRefer.connectionMap[homeState] = connectionEntryList; 
      ws.thisRefer.connecteduserIdMap[userId] = ""; 

     } 
+0

谢谢,我会给第二种方法一个尝试,我会接受这个答案,当我有我的负载测试结果。 –