群聊的 Websocket 最佳实践/所有组一个 websocket 或每个组一个 websocket?
Websocket best practice for groups chat / one websocket for all groups or one websocket per group?
我必须使用websocket实现一个聊天应用程序,用户将通过群组聊天,群组可以有数千个,一个用户可以在多个群组中。我正在考虑 2 个解决方案:
[1] 对于每个群聊,我创建了一个 websocket 端点(使用 camel-atmosphere-websocket),同一组中的用户可以订阅组端点并通过该端点发送 send/receive 消息。这意味着可以有数千个 websocket 端点。客户端(假设 iPhone)必须订阅多个 wbesocket 端点。这是一个好习惯吗?
[2] 我只是为所有组创建一个 websocket 端点。客户端只订阅这个端点,我自己在服务器上管理消息分发:获取组成员,从连接的 websockets 列表中选择每个成员的 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
我认为第二种方法更适合提高性能。我在我的应用程序中使用相同的方法,但它仍处于测试阶段,因此无法评论实时性能。现在它的 运行 适用于 10-15 个小组并且工作正常。在我的应用程序中,有类似的情况,用户可以基于组聊天。我正在使用 node.js 在服务器端处理组创建。这是创建组的代码,但它适用于我的应用程序特定条件。只是粘贴在这里供参考。从前端获取 homeState
和 userId
。基于 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] = "";
}
浏览器对同一个标签打开的websocket数量进行了限制。您不能指望能够创建尽可能多的连接。寻求解决方案 #2
我必须使用websocket实现一个聊天应用程序,用户将通过群组聊天,群组可以有数千个,一个用户可以在多个群组中。我正在考虑 2 个解决方案:
[1] 对于每个群聊,我创建了一个 websocket 端点(使用 camel-atmosphere-websocket),同一组中的用户可以订阅组端点并通过该端点发送 send/receive 消息。这意味着可以有数千个 websocket 端点。客户端(假设 iPhone)必须订阅多个 wbesocket 端点。这是一个好习惯吗?
[2] 我只是为所有组创建一个 websocket 端点。客户端只订阅这个端点,我自己在服务器上管理消息分发:获取组成员,从连接的 websockets 列表中选择每个成员的 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
我认为第二种方法更适合提高性能。我在我的应用程序中使用相同的方法,但它仍处于测试阶段,因此无法评论实时性能。现在它的 运行 适用于 10-15 个小组并且工作正常。在我的应用程序中,有类似的情况,用户可以基于组聊天。我正在使用 node.js 在服务器端处理组创建。这是创建组的代码,但它适用于我的应用程序特定条件。只是粘贴在这里供参考。从前端获取 homeState
和 userId
。基于 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] = "";
}
浏览器对同一个标签打开的websocket数量进行了限制。您不能指望能够创建尽可能多的连接。寻求解决方案 #2