Fab*_*ian 5 c# signalr .net-core
我在 .NET 6 上使用 SignalR .NET 客户端和服务器,重新连接延迟似乎与我预期的不同。我在服务器上使用以下代码来定义自定义 RetryPolicy:
connection = new HubConnectionBuilder()
.WithUrl(url)
.WithAutomaticReconnect(new RetryPolicy())
.Build();
public class RetryPolicy : IRetryPolicy
{
public TimeSpan? NextRetryDelay(RetryContext retryContext)
{
var delay = retryContext.PreviousRetryCount switch
{
< 5 => TimeSpan.FromSeconds(0),
< 10 => TimeSpan.FromSeconds(5),
_ => TimeSpan.FromSeconds(10),
};
Console.WriteLine($"NextRetryDelay count: {retryContext.PreviousRetryCount} elapsed: {retryContext.ElapsedTime} delay: {delay}");
return delay;
}
}
Run Code Online (Sandbox Code Playgroud)
当我触发断开连接时,我会得到以下输出:
NextRetryDelay count: 0 elapsed: 00:00:00 delay: 00:00:00
NextRetryDelay count: 1 elapsed: 00:00:08.1187903 delay: 00:00:00
NextRetryDelay count: 2 elapsed: 00:00:12.1619132 delay: 00:00:00
NextRetryDelay count: 3 elapsed: 00:00:16.2117377 delay: 00:00:00
NextRetryDelay count: 4 elapsed: 00:00:20.2883145 delay: 00:00:00
NextRetryDelay count: 5 elapsed: 00:00:24.3593463 delay: 00:00:05
NextRetryDelay count: 6 elapsed: 00:00:33.4387382 delay: 00:00:05
NextRetryDelay count: 7 elapsed: 00:00:42.4919265 delay: 00:00:05
NextRetryDelay count: 8 elapsed: 00:00:51.5778513 delay: 00:00:05
NextRetryDelay count: 9 elapsed: 00:01:00.6560698 delay: 00:00:05
NextRetryDelay count: 10 elapsed: 00:01:09.7329655 delay: 00:00:10
NextRetryDelay count: 11 elapsed: 00:01:23.7992479 delay: 00:00:10
NextRetryDelay count: 12 elapsed: 00:01:37.8539388 delay: 00:00:10
Run Code Online (Sandbox Code Playgroud)
对于每次延迟,除了我在此自定义 RetryPolicy 中指定的时间之外,似乎还会有大约 4 秒的额外延迟。第二次延迟甚至还有额外的 8 秒,这些值看起来相当可重复,尽管并不完全如此。
我在这里调整了测试的实际值,但我的目标是在开始时进行几次非常快速的重试。这似乎是不可能的,因为初始延迟不知从何而来,大约 8 秒。
这些额外的延迟从何而来?如何让 .NET 尊重我在此处设置的 RetryPolicy?
当您实现自定义 IRetryPolicy 时,您必须考虑到delay您输入的时间会添加到HubConnectionBuilder尝试重新连接之前所花费的时间。
因此,假设您的 SignalR 客户端在返回无法重新连接之前重试 4 秒,并将delay您设置的值添加到其中,您将获得您所获得的经过时间。
尝试重新连接花费的 4 秒 + 5 秒延迟 = 9 秒添加到之前经过的时间。
知道您可以将delay秒数更改为更少(或无),以使等待时间更快。
我在客户端上尝试了这种行为,重新连接大约需要 21 秒,并添加了 5 秒的延迟,并获得稳定的 26 秒等待时间,因此 RetryPolicy 工作得很好。
NextRetryDelay count: 0 elapsed: 00:00:00 delay: 5
NextRetryDelay count: 1 elapsed: 00:00:26.1568207 delay: 5
NextRetryDelay count: 2 elapsed: 00:00:52.2934825 delay: 5
NextRetryDelay count: 3 elapsed: 00:01:18.3989711 delay: 5
NextRetryDelay count: 4 elapsed: 00:01:44.5205752 delay: 5
NextRetryDelay count: 5 elapsed: 00:02:10.6291636 delay: 5
NextRetryDelay count: 6 elapsed: 00:02:36.7462710 delay: 5
NextRetryDelay count: 7 elapsed: 00:03:02.8838054 delay: 5
NextRetryDelay count: 8 elapsed: 00:03:29.0223075 delay: 5
NextRetryDelay count: 9 elapsed: 00:03:55.1337186 delay: 5
NextRetryDelay count: 10 elapsed: 00:04:21.2564770 delay: 5
Run Code Online (Sandbox Code Playgroud)