Websocket群聊最佳实践:为每个群组使用一个Websocket还是一个Websocket适用于所有群组?

9
我需要使用websocket实现一个聊天应用程序,用户将通过群组进行聊天,可以有成千上万个群组,用户可以在多个群组中。我想到了两种解决方案:
[1] 对于每个群组聊天,我创建一个websocket端点(使用camel-atmosphere-websocket),同一群组的用户可以订阅该群组的端点并通过该端点发送/接收消息。这意味着可能会有数千个websocket端点。客户端(比如iPhone)必须订阅多个websocket端点。这是一个好的做法吗?
[2] 我仅为所有群组创建一个websocket端点。客户端只需订阅此端点,我在服务器上管理消息分发:获取组成员,从连接的websocket列表中挑选每个成员的websocket,然后通过websocket向每个成员写入消息。
哪种解决方案在性能和易于在客户端和服务器上实现方面更好?
谢谢。
编辑2015-10-06:
我选择了第二种方法,并使用jetty websocket客户端进行了测试,在服务器端使用了camel atmosphere websocket。在客户端,我在线程中创建websocket连接。Jetty存在一个问题,我只能创建大约160个websocket连接(这意味着大约160个线程)。结果是当客户端数量从1增加到160时,我几乎看不到任何差异。
是的,160不是一个很大的数字,但我认为当我实际看到性能问题时,我会做更多测试,现在,我对第二种方法感到满意。
如果你对测试代码感兴趣,这里是链接: http://www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html#d0e22545
2个回答

8

我认为第二种方法在性能方面会更好。我正在使用同样的方法来开发我的应用程序,但它仍处于测试阶段,无法评论实时性能。现在它正在运行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]  = "";

        }

谢谢,我会尝试第二种方法,当我得到负载测试结果时,我会接受这个答案。 - Dzung BUI

1
浏览器对同一标签页打开的WebSocket数量实施限制。您不能指望能够创建尽可能多的连接。选择方案#2。

你有任何来源吗?三年前,楼主已经写下他想采取第二种方法。 - Nico Haase
@NicoHaase 许多在线资源都指向这些限制。我也将其添加为答案,因为选择#2的原始原因是基于性能分析,其他寻找此信息的人可能不认为与他们的情况相关,并错过了这个明显的限制。 https://dev59.com/tl8e5IYBdhLWcg3wLX8-#26013035 https://dev59.com/kH7aa4cB1Zd3GeqPpWFz - Lou-adrien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接