zaf*_*s.m 5 c# async-await azure-queues
我尝试异步地将Azure队列中的消息排入队列,如下所示:
private async Task EnqueueItemsAsync(IEnumerable<string> messages) {
var tasks = messages.Select(msg => _queue.AddMessageAsync(new CloudQueueMessage(msg),
null, null, null, null));
await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)
如果我说得对,这说"开始将一个项目排在另一个项目之后而不等待它们发布,请为每个任务保留一个参考,然后等待所有发布".
此代码在大多数情况下工作正常,但对于大量项目(5000),它开始入队,然后抛出超时异常(在排队~3500项后).
我通过等待每一个完成然后继续下一个来解决它
private async Task EnqueueItemsAsync(IEnumerable<string> messages) {
foreach (var message in messages) {
await _queue.AddMessageAsync(new CloudQueueMessage(message), null, null, null, null);
}
}
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?
例外:
System.AggregateException包装许多此类异常:Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar)请求信息RequestID:RequestDate:StatusMessage:<--- --->(内部异常#1)Microsoft.WindowsAzure.Storage.StorageException:客户端无法在指定的超时内完成操作.---> System.TimeoutException:客户端无法在指定的超时内完成操作.---内部异常堆栈跟踪结束--- Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync [T](IAsyncResult result)`.
Azure中的队列设计具有每秒2000条消息的吞吐量.
请参阅:Azure存储可伸缩性和性能目标
当您的应用程序达到分区可以处理的工作负载限制时,Azure存储将开始返回错误代码503(服务器忙)或错误代码500(操作超时)响应.发生这种情况时,应用程序应使用指数退避策略进行重试.指数退避允许分区上的负载减少,并减轻流向该分区的流量峰值.