组聊天的Websocket最佳做法/所有组一个websocket或每个组一个websocket?

Dzu*_*BUI 4 performance websocket atmosphere

我必须使用websocket实现一个聊天应用程序,用户将通过组进行聊天,可以有成千上万的组,一个用户可以在多个组中。我正在考虑2个解决方案:

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

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

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

谢谢。


编辑2015-10-06

我选择了第二种方法,并与Jetty Websocket客户端进行了测试,我在服务器端使用了骆驼式Websocket。在客户端,我在线程中创建到服务器的Websocket连接。码头存在一个问题,我只能创建大约160个websocket连接(这意味着大约160个线程)。结果是,当客户端数量从1增加到160时,我几乎看不到任何区别。

是的,160不是一个很大的数字,但是当我实际看到性能问题时,我想我会做更多的测试,就目前而言,我可以接受第二种方法。

如果您对测试代码感兴趣,请访问以下网址http : //www.eclipse.org/jetty/documentation/current/jetty-websocket-client-api.html#d0e22545

Kun*_*mar 5

我认为第二种方法会更好地用于性能。我在我的应用程序中使用了相同的功能,但是它仍处于测试阶段,因此无法评论实时性能。现在,它可以运行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]  = "";

        }
Run Code Online (Sandbox Code Playgroud)