异步发布到Azure队列

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)`.

Mår*_*röm 6

Azure中的队列设计具有每秒2000条消息的吞吐量.

请参阅:Azure存储可伸缩性和性能目标

当您的应用程序达到分区可以处理的工作负载限制时,Azure存储将开始返回错误代码503(服务器忙)或错误代码500(操作超时)响应.发生这种情况时,应用程序应使用指数退避策略进行重试.指数退避允许分区上的负载减少,并减轻流向该分区的流量峰值.