2014-10-03 94 views
0

我们的Safari移动客户端受到signalr阻塞的5个连接之一的影响。我们使用的解决方案扶起这里:https://github.com/SignalR/SignalR/issues/1406#issuecomment-14284093Signalr LongPollDelay和缓冲区

,我们有这些设置更改为signalR 2.X以下

  • GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMilliseconds(1000);
  • GlobalHost.Configuration.LongPollDelay = TimeSpan.FromMilliseconds(5000);

我们发送通知从服务器到客户端没有消息队列或确认框架。我们不需要保证信息传递,但我们确实希望那里有很高的成功可能性。我们认为,这应该是可能的,因为我们的低消息率和1000缓冲区大小但是有一些问题:

  1. 在队列中的消息举行,而LongPollDelay发生?在下次长时间轮询期间,他们是否应该使用上述设置发送 ?
  2. 我们在2分钟内发送单条消息的测试中,LongPollDelay建议在接下来的第二个长轮询请求期间不检索它们。 这是否有任何理由,即1分钟后缓冲液冲洗?
  3. ConnectionTimeout会影响所有传输吗?
  4. 如果ConnectionTimeout适用于所有传输,是否有一种方式 仅为Safari移动用户设置此选项,即有两个连接 可用,并使用代理检测指向特定连接?
  5. 有没有设置LongPollDelay的方法,这样也只有 只适用于Safari移动用户?

所有建议欢迎和赞赏,马特

[后续问题]

感谢那些帮助了很多。我们已经重试了30秒的LongPollDelay,并按预期工作。我有几个后续问题可供您/他人关注:

1)在测试期间,我们还会看到客户端大约每5分钟向服务器发送一次ping请求。为什么ping时间间隔设置为5分钟,当断开时间如此之短时,如果客户端假定服务器通过备用机制断开连接,则ping服务器的目的是什么?

2)w.r.t.针对不同客户的不同配置。我们是否可以不设置另一个SignalR端点并仅指定Safari移动设备?类似的回应这篇文章: Can I reduce the Circular Buffer to "1"? Is that a good idea?

回答

1
  1. 你是正确的SignalR将排队/缓冲消息。即使没有配置LongPollDelay,SignalR也需要这样做,因为在客户端进行repolling/reconnecting时总会有消息发送的机会。

  2. 如果客户端在最后的DisconnectTimeout内没有连接到服务器,SignalR假定客户端已断开连接。一旦DisconnectTimeout触发,SignalR将调用OnDisconnected并清除属于断开连接的客户端的任何消息缓冲区,以免泄漏内存。 DisconnectTimeout默认为30秒,远小于您配置的2分钟LongPollDelay,因此可以解释此行为。

  3. ConnectionTimeout只影响长轮询,除非您已禁用保持活动状态。如果禁止活动,它适用于所有的运输。

  4. 无法为特定类型的客户端选择性地配置ConnectionTimeout。但正如我所说,它只会影响默认的长轮询。

  5. 没有办法为特定类型的客户端选择性地配置LongPollDelay。

+0

谢谢,我添加了一个后续问题供您考虑。 – MattPil29 2014-10-06 09:22:02

+0

通常最好是将后续问题作为新的SO问题提出,但我会在这里回答。 1)Pings用于保持会话cookie活动,需要提出新的请求。 2)您可以配置多个端点,但是如果您希望端点与其他端点进行通信,则需要共享一个IMessageBus。这可以使用SignalR的IDependencyResolver来实现。请注意,两个端点应该*不共享IDependencyResolver,只是IMessageBus。 – halter73 2014-10-09 21:26:28