StackExchange NetGain vs Node.js WS websocket服务器的性能

我主要是一个C#/ .NET开发人员,他需要编写一个相对简单但高性能和稳定的websocket服务器。 目前,它看起来像微软的websocket相关工作的唯一官方平台是SignalR。 但是,为了我的需要,它增加了太多的开销。

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

Node.js上的WS模块比NetGain更有效吗? 对于简单的基于NetGain的websocket服务器,我可以在单个基于四核的机器上使用多less个并发连接? 我真的很喜欢使用NetGain,并保持与C#,因为我还在学习Node.js,但是,如果有一个很大的性能差异比我宁愿去与节点。

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

在Ably ,我们以很less的开销处理数百万个websocket连接,因为保持连接打开需要很less的工作。 当我们devise我们的前端服务器终止并保持打开的WebSocket连接时,我们看了几件事情:

  • WS连接是否需要心跳,如果有,多频繁? 我们是否仅仅依靠TCP / IP来检测连接消失,还是提高心跳突然断开检测的可靠性? 我们需要后者,以便能够提供更准确的状态/设备意识 ,从而增加了很多开销。 例如,如果我们在一个盒子上有100k个连接,并且每隔10秒发送一次心跳,那么每秒发送和接收的心跳数就是10k,所以每秒钟有20k个dataframe。
  • 每个连接的预期工作速率是多less? 我们假设连接使用会有很大的差异,但您需要对每个连接的预期工作做一个粗略的估计。 我们假定平均每个广播每个连接有1条消息,每分钟收到10条消息。 因此,如果再假设100k连接,那么每秒发送的100k个消息加上收到的16k消息加上发送的约16k个ACK。
  • 每次有新的连接进来时,连接重复连接的频率以及需要多less工作。例如,连接了100k个连接,并希望每个连接每10分钟重新连接一次,即每秒连接166个新连接。 每个新连接都需要握手,身份validation和HTTP升级,所以我们假设这相当于build立一个连接的总共大约20次操作,即每秒钟3,320次。
  • 是否终止TLS,如果是, 所有投注都closures 。 因此,假设所有以上的100k连接,我们可以预计大约20k的心跳操作+ 100k消息广播+ 32k消息收到包括。 ACK + 3.3k连接terminal=每秒155k次操作。

但是,这并不是说明高峰和低谷,期望持续的高峰(超过1分钟的时间)超过3-4倍的平均水平并不是不现实的,所以这大概是每秒60万次的操作。

结论

谈到一个WS库可以容纳多less个连接并不重要。 处理消息,处理身份validation,处理故障以及与其他系统进行通信可能会耗尽您的所有资源,因此,如果您想估计一个健壮的方块可以做什么,那么请从这里开始。

Matt,联合创始人Ably – 只是更好的实时