我主要是C#/。NET开发人员,需要编写一个相对简单但高性能且稳定的websocket服务器。目前,SignalR似乎是Microsoft唯一用于Websocket相关工作的官方平台。但是,对于我的需求,它增加了过多的开销。
另一个吸引人的选择是StackExchange的NetGain库,但是,除了github页面外,似乎没有多少其他信息。在stackoverflow上甚至没有与该库相关的问题/答案。我确实在stackexchange上找到了某人的Twitter帖子,显示NetGain服务于500K并发会话,但这些会话分散在多台计算机上。相反,Node.js上的WS模块可以在单个服务器上处理550K。
Node.js上的WS模块是否比NetGain更有效率?对于基于NetGain的简单Websocket服务器,在一台基于四核的计算机上可以有多少个并发连接?我真的很想使用NetGain并继续使用C#,因为我仍在学习Node.js,但是,如果性能差异很大,那么我宁愿使用Node。
最佳答案
不幸的是,在性能方面更好的毯子不是正确的问题。
在Ably处,我们以很少的开销处理数百万个Websocket连接,因为仅需保持连接打开就不需要太多工作。当我们设计终止并保持打开的WebSocket连接的前端服务器时,我们研究了以下几点:
WS连接是否需要心跳,如果需要,请多久一次?我们是否仅依靠TCP / IP来检测断开连接,还是通过心跳提高突然断开连接检测的可靠性?我们需要后者,以便我们可以提供更准确的presence / device awareness,从而增加了很多开销。例如,如果我们在一个盒子上有10万个连接,并且每10秒发送一次心跳,即每秒发送和接收10k心跳,那么每秒20k帧数据。
每个连接的预期工作速率是多少?我们假设连接使用情况会发生巨大变化,但是您确实需要对每个连接的预期工作进行粗略估算。我们假设每个广播连接平均每秒发送1条消息,每分钟接收10条消息。因此,如果您假设连接数为100k,则每秒广播100k条消息,再加上收到的16k条消息,再加上发送的大约16k ACK。
连接断开和重新连接的频率如何,每次建立新连接都要进行多少工作。例如,如果您有10万个连接,并且希望每个连接每10分钟重新连接一次,则每秒有166个新连接。每个新连接都需要握手,身份验证和HTTP升级,因此假设建立连接总共相当于进行大约20次操作或每秒3,320次。
是您的终止TLS(如果是),all bets are off。
因此,假设对于100k个连接,上述所有条件,我们可以预期大约进行20k个心跳操作+ 100k消息广播+ 32k消息接收(包括)。 ACK + 3.3k连接终止=每秒15.5万次操作。
但这并不能说明高峰和低谷,期望您的持续峰值(例如1分钟内)超过平均值3至4倍也不是不切实际的,因此每秒大约60万次操作。
结论
谈论WS库可以保持多少个连接并不重要。处理消息,处理身份验证,处理故障以及与其他系统进行通信可能会耗尽您的所有资源,因此,如果您想估算一个强大的功能,则从那里开始。
Ably - simply better realtime联合创始人Matt
关于c# - StackExchange NetGain与Node.js WS Websocket服务器的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37846435/