StackExchange NetGain 与 Node.js WS websocket 服务器性能对比

Posted

技术标签:

【中文标题】StackExchange NetGain 与 Node.js WS websocket 服务器性能对比【英文标题】:StackExchange NetGain vs Node.js WS websocket server performance 【发布时间】:2016-06-15 21:53:09 【问题描述】:

我主要是一名 C#/.NET 开发人员,需要编写一个相对简单但高性能且稳定的 websocket 服务器。目前,微软提供 websocket 相关工作的唯一官方平台似乎是 SignalR。但是,对于我的需要,它增加了太多开销。

另一个看起来很吸引人的选项是 StackExchange 的 NetGain 库,但是,除了 github 页面之外似乎没有太多信息。 *** 上甚至没有与该库相关的问题/答案。我确实在 stackexchange 上找到了一个 Twitter 帖子,显示 NetGain 服务于 500K 并发会话,但这些会话分布在多台机器上。相比之下,Node.js 上的 WS 模块可以在单个服务器上处理 550K。

Node.js 上的 WS 模块是否比 NetGain 更高效?对于简单的基于 NetGain 的 websocket 服务器,我可以在一台基于四核的机器上拥有多少个并发连接?我真的很想使用 NetGain 并继续使用 C#,因为我仍在学习 Node.js,但是,如果性能差异很大,我宁愿使用 Node。

【问题讨论】:

【参考方案1】:

不幸的是,在性能方面更好的毯子不是正确的问题。

在Ably,我们以非常少的开销处理数百万个 websocket 连接,因为简单地保持连接打开需要很少的工作。当我们设计终止并保持打开的 WebSocket 连接的前端服务器时,我们查看了一些内容:

WS 连接是否需要心跳,如果需要,频率如何?我们是仅仅依靠 TCP/IP 来检测断开的连接,还是通过心跳来提高突然断开检测的可靠性?我们需要后者,以便我们可以提供更准确的presence / device awareness,这样会增加很多开销。例如,如果我们在一个盒子上有 10 万个连接,并且每 10 秒发送一次心跳,即每秒发送和接收 1 万次心跳,因此每秒有 2 万帧数据。 每个连接的预期工作速率是多少。我们假设连接使用情况会有很大差异,但您确实需要粗略估计每个连接的预期工作量。我们假设每个连接广播平均每秒 1 条消息,每分钟接收 10 条消息。因此,再次假设您有 10 万个连接,即每秒广播 10 万条消息加上接收的 16 万条消息加上发送的大约 16 千条 ACK。 连接断开和重新连接的频率以及每次新连接进入时需要多少工作。例如,如果您有 10 万个连接并希望每个连接每 10 分钟重新连接一次,则每秒有 166 个新连接。每个新连接都需要握手、身份验证、HTTP 升级,因此我们假设这相当于总共大约 20 次操作来建立连接或每秒 3,320 次。 您是否终止 TLS,如果是,all bets are off。 因此,假设上述所有连接为 100k 连接,我们可以预期大约 20k 心跳操作 + 100k 消息广播 + 32k 消息接收,包括。 ACK + 3.3k 连接终止 = 每秒 155k 次操作。

但这还没有考虑高峰和低谷,期望您的持续高峰(例如 1 分钟)超过您的平均值 3 到 4 倍并非不现实,也就是说每秒大约 60 万次操作。

结论

谈论一个 WS 库可以打开多少个连接并不重要。处理消息、处理身份验证、处理故障以及与其他系统通信可能会耗尽你所有的资源,所以如果你想估计一个强大的盒子能做什么,就从那里开始吧。

马特,联合创始人,Ably - simply better realtime

【讨论】:

有趣的分析。在对 NetGain 进行了更多挖掘之后,我发现它不支持 SSL,并且他们没有计划在短期内添加 SSL 支持。 WS 似乎是目前唯一的选择。 如果您可以将 TLS 终止分流到负载均衡器,我强烈推荐它,请参阅 blog.mattheworiordan.com/post/19257368025/…

以上是关于StackExchange NetGain 与 Node.js WS websocket 服务器性能对比的主要内容,如果未能解决你的问题,请参考以下文章

Dapper简易教程(翻译自Github上StackExchange/Dapper)

Stackexchange.Redis'火上浇油并忘记保证交货吗?

StackExchange.Redis实现Redis发布订阅

StackExchange.Redis 基本使用 (转)

扩展 StackExchange.Redis 支持实体

StackExchange.Redis TimeOut