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

时间:2013-06-27 08:25:18

标签: signalr throttling persistent-connection

我正在使用PersistentConnection将大量数据(许多小包)发布到连接的客户端。

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

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

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

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

protected override Task OnConnectionSlow(IRequest request, string connectionId) {}

但这不是框架的一部分(出于好的理由,我假设)。

我已经考虑过使用这种方法(在Stackoverflow上的其他地方建议),让客户端告诉服务器(例如每10-30秒)收到多少消息,以及该数字是否与消息数量有所区别发送给客户,很可能客户无法跟上。

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

1 个答案:

答案 0 :(得分:1)

除了编写自定义内容之外,现在没有办法实现此目的。我们过去曾将此作为一个潜在的功能进行了讨论,但现在并不是路线图的任何地方。还不清楚“缓慢”意味着什么,因为它取决于应用程序的决定。可能存在某种基于带宽/时间/消息的设置会使该假设事件触发。

如果你想以非常低的水平挂钩,你可以使用owin中间件将客户端的基础流替换为你拥有的一个,这样你就可以看到所有数据都在写入(你有为websockets做同样的事情,这可能是非常重要的)。

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

这非常模糊,但它基本上是一个像这样的功能如何工作的大脑转储。