【问题标题】:SignalR / Websockets connection limitations and best practicesSignalR / Websockets 连接限制和最佳实践
【发布时间】:2015-10-19 13:01:33
【问题描述】:

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

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

我希望在任何时候打开非常多(成千上万)的 websocket,但是发送的消息很少,可能每分钟几条,它们将始终是服务器->客户端(并且单个特定的客户端,而不是广播)。这种安排是否/应该引导我走上任何特定的实施路线?

看来 SignalR 集线器可能是矫枉过正,我不需要不支持 websockets 的客户端的后备,我只需要维护每个客户端连接的句柄,这样当我的系统“决定”发送消息到一个特定的客户端,它可以适当地路由它。

我引用的文档:

谢谢

【问题讨论】:

  • 我很确定 Web 套接字在空闲时使用 TCP/IP 连接 - 这样他们就可以将数据推送回客户端。您能否提供有关并发 Websocket 连接的文档的参考?
  • 您将使用什么协议? UDP 还是 TCP?
  • @ThomasWagenaar Websocket 仅支持 TCP,不是吗?我想知道WebRTC这里有没有应用...

标签: websocket signalr


【解决方案1】:

然而,当谈到 websockets 时,它的定义是什么? “同时”?如果我打开了一个 websocket 并且它处于空闲状态,是 那个“使用”连接?空闲的 websocket 是否计入连接 使用总计,还是仅在消息被发送时才计算 发送/接收?

是的,一个空闲的打开连接不会消耗太多资源,除了 TCP 保持活动,如果您的服务器支持它们,可能还有协议和/或应用程序级别的 ping/pongs。更重要的是,由于 Websocket 是面向连接的,您可能还持有一些与连接相关的状态(用户对象、用户数据等)

我希望拥有非常多(成千上万)的 websocket 随时打开,但是发送的消息很少, 也许每分钟几个,他们将永远是服务器->客户端(和 到单个特定客户端,而不是广播)。是否/应该这样做 安排让我走上任何特定的实施路线?

是的,不使用 SignalR 的路由:SignalR Scale-out (check the limitations section)。直接使用 WebSockets 并使用允许智能路由的框架实现您自己的消息传递后端,例如 RabbitMQ。您不想使用基本上对所有节点进行“扇出”的背板,尤其是在数据是每个用户的情况下。

SignalR 是一个 polyfill,一个临时框架,直到 WebSocket 被广泛支持...and that already happened。还忘了提到从 Windows server 2012 起可以使用 WebSockets :)

【讨论】:

  • 感谢您的回复。所以你是说由于我的消息吞吐量低,我真的不需要关心“并发”吗?你知道我可能会遇到什么限制,或者它们被称为什么以及在哪里可以了解它们?
  • 哦,不,由于您不是广播而是发送高度分段的消息(不是广播,不是按组,而是按用户),因此您不应该使用 SignalR。 SignalR 使用背板进行横向扩展,这意味着如果您有 8 台服务器,则会将消息发送到 8 台服务器,而与您的用户连接位置无关。现在消息频率低可能不是什么大问题,但如果您的应用程序试图变得更大,这可能是一个大问题:) 如果您计划支持数十万个并发连接,则必须适当地扩展成为您列表中非常重要的一项。
  • 抱歉,我认为我们的线路有问题。我理解背板。您回答的第一部分解决了我的问题的第一部分,这似乎表明您在低消息频率、高客户端情况下淡化了对连接并发性的关注。如何预测每台服务器可以支持的客户端数量?
  • 如果您不确定,建议您编写一些测试代码来自动化大量客户端。我在生产环境中使用过 Web 套接字,但客户端少于 100 个,尽管消息更多,但每分钟最多 50 个。
  • 嗯,这个预测有点难做,取决于你理解的“每分钟几个”和平均消息大小。我会尽早开始基准测试。显然,有成千上万的人需要……至少……为它做好计划:) WebSocket 只是一种传输方式,因此解决方案的性能和扩展方式的很大一部分将取决于您如何处理线程以及如何传递消息到 websocket 连接。例如,如果您为每个连接打开一个新线程,则不要期望有“数千个”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2011-03-19
  • 1970-01-01
  • 2013-09-28
  • 2012-05-28
  • 2021-09-13
  • 2015-08-03
相关资源
最近更新 更多