我花了一些时间来理解重置策略背后的理念Azure Storage SDK(以及可能还有otehr SDK)。
有关Microsoft文档,请参阅https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#azure-storage-retry-guidelines
请考虑以下代码:
// [...] get storage, queueclient, queue, ...
CloudQueueMessage message = new CloudQueueMessage ("sample");
OperationContext operationContext = new OperationContext();
operationContext.SendingRequest += (sender, eventArgs) => {
Console.WriteLine(">> {0}: SendingRequest...", DateTime.Now.ToString("hh:mm:ss.fff tt"));
};
operationContext.Retrying += (sender, eventArgs) => {
Console.WriteLine(">> {0}: Retrying...", DateTime.Now.ToString("hh:mm:ss.fff tt"));
};
operationContext.RequestCompleted += (sender, eventArgs) => {
Console.WriteLine(">> {0}: RequestCompleted (took: {1}).",
DateTime.Now.ToString("hh:mm:ss.fff tt"),
(eventArgs.RequestInformation.EndTime - eventArgs.RequestInformation.StartTime).TotalMilliseconds);
};
operationContext.ResponseReceived += (sender, eventArgs) => {
Console.WriteLine(">> {0}: ResponseReceived...", DateTime.Now.ToString("hh:mm:ss.fff tt"));
};
QueueRequestOptions queueRequestOptions = new QueueRequestOptions
{
// RETRY POLICY
RetryPolicy = new LinearRetry(TimeSpan.FromMilliseconds(2000), 3),
MaximumExecutionTime = TimeSpan.FromSeconds(40)
};
try
{
await queue.AddMessageAsync(message, TimeSpan.FromDays(7), TimeSpan.Zero, queueRequestOptions, operationContext);
}
catch (Exception ex)
{
Console.WriteLine("EXCEPTION: " + ex.Message);
return false;
}
测试设置 - 我设置了一个本地DNS条目,将请求重定向到messagebox.queue.core.windows.net到本地IP地址(没有响应),以模拟连接超时。
观察:
06:13:01.952:SendingRequest ...
06:13:23.036:RequestCompleted(拍摄时间:21083,6253) 06:13:25.040:重试......
06:13:25.040:发送请求...
06:13:41.908:RequestCompleted(拍摄时间:16867,7884) EXCEPTION:客户端无法在指定的超时内完成操作。
MaximumExecutionTime
是客户必须成功传递信息的困难时期RetryPolicy定义后退时间 查看上面的时间戳,您会看到初始请求失败后重试〜2000ms。这正是我之前在RetryPolicy中定义的2000毫秒。
我可能无法控制的是客户端尝试传递消息的时间。如果未指定MaximumExecutionTime
,则默认为120秒。
删除MaximumExecutionTime
属性后的结果:
06:21:21.681:SendingRequest ...
06:21:42.752:RequestCompleted(拍摄时间:21071,3961) 06:21:44.762:重试......
06:21:44.762:SendingRequest ...
06:22:26.820:RequestCompleted(take:42057,7503) 06:22:28.835:重试......
06:22:28.835:发送请求...
06:23:10.868:RequestCompleted(拍摄:42033,8183) 06:23:12.886:重试......
06:23:12.886:发送请求...
06:23:54.928:RequestCompleted(参见:42042,4322) EXCEPTION:发送请求时发生错误。
以下是我对此的疑问......
好的,为什么第一个请求的超时值为~20秒,所有后续请求的超时值为〜40秒?
我可以控制吗?我希望请求失败的速度远远超过20秒甚至40秒!
作为"解决方法"我将MaximumExecutionTime
设置为500毫秒
我将重试政策设为NoRetry
我正在使用Polly来处理重试。