如何在服务器端限制SignalR客户端

如何在服务器端限制SignalR客户端,signalr,throttling,persistent-connection,Signalr,Throttling,Persistent Connection,我使用PersistentConnection向连接的客户端发布大量数据(许多小软件包) 它基本上是数据的单向(因为每个客户端将调用其他服务器上的端点来设置各种订阅,所以它们不会通过signar连接将任何数据推回到服务器) 有没有办法检测到客户端无法跟上发送给它的消息 例如,连接不良的移动客户端(例如,在漫游情况下,速度可能变化很大)。如果我们每秒发送100条消息,但客户端只能处理10条,那么我们最终将丢失消息(由于服务器端的消息缓冲区) 我在寻找一个服务器端事件,类似于在(signar)客户机

我使用PersistentConnection向连接的客户端发布大量数据(许多小软件包)

它基本上是数据的单向(因为每个客户端将调用其他服务器上的端点来设置各种订阅,所以它们不会通过signar连接将任何数据推回到服务器)

有没有办法检测到客户端无法跟上发送给它的消息

例如,连接不良的移动客户端(例如,在漫游情况下,速度可能变化很大)。如果我们每秒发送100条消息,但客户端只能处理10条,那么我们最终将丢失消息(由于服务器端的消息缓冲区)

我在寻找一个服务器端事件,类似于在(signar)客户机上所做的事情,例如

protected override Task OnConnectionSlow(IRequest request, string connectionId) {}
但这并不是框架的一部分(我认为这是有充分理由的)

我考虑过使用这种方法(Stackoverflow上的其他地方建议),让客户机告诉服务器(例如,每10-30秒)它收到了多少消息,如果这个数字与发送给客户机的消息数量有很大差异,那么客户机很可能无法跟上


该事件将用于告诉分布式后端客户端无法跟上,然后降低数据生成速率

现在除了编写自定义代码之外,没有其他方法可以做到这一点。我们在过去讨论过这是一个潜在的功能,但现在它还不在路线图的任何地方。也不清楚“慢”是什么意思,因为这取决于应用程序。可能会有某种基于带宽/时间/消息的设置,使这个假设的事件触发

如果您想在一个非常低的级别上进行连接,那么可以使用owin中间件将客户机的底层流替换为您拥有的底层流,这样您就可以看到所有的数据在写入过程中的变化(不过,您必须对WebSocket执行相同的操作,这可能并不简单)

一旦你有了它,你可以写一些基于时间的逻辑来确定刷新是否花费了太长的时间,并以此方式杀死客户端


这很模糊,但这基本上是一个大脑转储,说明了这样一个功能是如何工作的。

感谢您的快速回复-我不希望您手头有一个微不足道的解决方案,但很高兴知道它已经被考虑过,并且没有计划。我可能会让它保持现在的状态,如果我们看到这方面的问题,我会把它捡起来。@davidfowl我有一个想法,将信号器输出函数“节流”到Mbits/s。我们已经连接了10000个WebSocket,如果我调用“Clients.All.func()”,它会向每个WebSocket发送1k,即10兆字节,或者以100Mbps的速度略低于1秒。我想把速度限制到10 Mbps,在10秒内分散。Windows QoS GPO是否适用于此?也许,但这是一把锤子。你能这样针对一个特定的过程吗?好问题。我刚刚贴了一个类似的帖子,然后看到了你的问题。