问题 SignalR / Websockets连接限制和最佳实践


我试图了解如何最好地设计基于IIS / ASP.NET的websocket应用程序,特别是关于并发限制。

我已经阅读了有关“并发Websocket连接”的IIS / ASP.NET的所有文献以及如何调整各种值 - 但是,在谈到websockets时,“并发”的定义是什么? 如果我打开了一个websocket并且它处于空闲状态,那是“使用”连接吗?空闲的websockets是否计入连接使用总数,或仅在发送/接收消息时计算?

我希望在任何时候都可以打开一个非常高(100个)的网页数量,但是发送的消息很少,可能每分钟几个,它们将始终是服务器 - >客户端(并且单个,特定的客户,而不是广播)。这种安排是否/应该引导我进入任何特定的实施路线?

似乎SignalR集线器可能有点过分,我不需要不支持websockets的客户端的后备,我只需要维护每个客户端连接的句柄,这样当我的系统“决定”向特定客户端发送消息时,它可以适当地路由它。

我正在引用的文档:

谢谢


11172
2017-07-28 19:23


起源

我很确定Web套接字在空闲时使用TCP / IP连接 - 这样他们就可以将数据推送回客户端。您能提供有关并发Websocket连接的文档的参考吗? - Daniel James Bryars
你会用什么协议? UDP还是TCP? - Thomas W
@ThomasWagenaar Websockets只是TCP,不是吗?我想知道WebRTC在这里是否有任何应用...... - Andrew Bullock


答案:


但是,在谈到websockets时,有什么定义   “同时”?如果我打开了一个websocket并且它闲置着,那就是   “使用”连接?空闲的websockets是否计入连接   使用总数,或仅在消息出现时计算   发送/接收的?

是的,闲置的开放连接不会消耗超出TCP保持活动的资源,也可能是协议和/或应用程序级ping / pongs,如果您的服务器支持它们。更重要的是,由于Websockets是面向连接的,你可能也持有与连接相关的一些状态(用户对象,用户数据等......)

我希望有一个非常高(数百个)的websockets   任何时候都打开,但是发送的消息很少,   也许每分钟几个,他们将永远是服务器 - >客户端(和   到一个特定的客户,而不是广播)。是/应该这样做   安排引导我走下任何特定的实施路线?

是的,对于不使用SignalR的路线: SignalR横向扩展(检查限制部分)。直接使用WebSockets并使用允许智能路由的框架实现您自己的消息传递后端 的RabbitMQ 例如。您不希望使用基本上对所有节点进行“扇出”的背板,尤其是如果数据是每个用户的话。

SignalR是一个polyfill,一个瞬态框架,直到当天广泛支持WebSockets ... 那已经发生了。还忘了提到从Windows Server 2012开始可以使用WebSockets :)


9
2017-07-28 19:41



感谢您的答复。所以你说由于我的消息吞吐量低,我真的不需要关心“并发”吗?你知道我可能会遇到什么限制,或者他们叫什么,所以在哪里阅读它们? - Andrew Bullock
哦,不,由于您不是广播而是发送高度分段的消息(不是广播,不是群组,而是用户),您不应该使用SignalR。 SignalR使用背板进行向外扩展,这意味着如果您有8台服务器,则会向8台服务器发送一条消息,而与用户所连接的位置无关。如果你的应用程序试图变大,那么它现在可能不是一个很大的问题,但如果你的应用程序试图变大,它可能是一个很大的问题:)如果你计划支持数十万个并发连接,那么必须适当地扩展是你列表中的一个非常大的项目。 - vtortola
对不起,我想我们已经交叉了。我理解后退计划。你的答案的第一部分解决了我的问题的第一部分似乎暗示你在低消息频率,高客户端情况下淡化了连接并发的问题。如何预测每台服务器可以支持的客户端数量? - Andrew Bullock
如果您不确定,建议编写一些测试代码以自动化大量客户端。我在生产环境中使用过网络套接字但是有100个客户端,尽管有更多消息,每分钟最多50个。 - Adam Marshall
那么预测有点难以做到,并且根据您所理解的“每分钟少数”和平均消息大小而有所不同。我会尽早开始测量。显然有成千上万的人需要......至少......为它做好计划:) WebSocket只是一种传输,因此解决方案的执行和扩展方式的重要部分在于如何处理线程以及如何传递消息到websocket连接。例如,如果您为每个连接打开一个新的线程,请不要指望它们“成千上万”。 - vtortola