几乎没有请求的Azure队列限制错误(StorageException:服务器正忙)

时间:2017-04-18 08:26:44

标签: c# azure azure-storage azure-storage-queues

  • 语言:C#

  • 框架:.NET CORE 1.1.1

  • Nuget:WindowsAzure.Storage版本8.1.1

您好,

我在Azure上使用队列存储。 我有4个程序,每个请求每秒1次(GetMessagesAsync请求)。 所以我提出4个请求/秒。

但有时会出现导致此异常的限制错误:

  

System.AggregateException:发生了一个或多个错误。 (服务器是   忙。)---> Microsoft.WindowsAzure.Storage.StorageException:The   服务器很忙。\ r \ n at   Microsoft.WindowsAzure.Storage.Core.Executor.Executor.d__4`1.MoveNext(个)\ r \ n ---   从抛出异常的先前位置开始的堆栈跟踪结束   --- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)\ r \ n at   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)\ r \ n at   Microsoft.WindowsAzure.Storage.Queue.CloudQueue<> c__DisplayClass83_0< b__0> d.MoveNext(个)\ r \ n

我不知道为什么我会收到此错误,因为单个队列的Azure目标吞吐量高达每秒2000条消息。

其他信息:

  • 我的消息是小json文件(1ko大小)
  • 我查看了我的天蓝色门户网站,在7天内,我的程序发出了2.2M请求(~3.6个请求/秒)
  • 当我得到"服务器忙碌时#34;例外我在我的天蓝色门户网站中也遇到了限制错误

我的功能我在哪里获取:

protected async Task<IEnumerable<CloudQueueMessage>> GetAndDequeueMessagesAsync(int numberOfMessagesToRetrived = 1) {
            try
            {
                IEnumerable<CloudQueueMessage> messages = await GetMessagesAsync(numberOfMessagesToRetrived);
                foreach (CloudQueueMessage queueMessage in messages)
                {
                    await DequeueMessageAsync(queueMessage);
                }
                return messages;
            }
            catch (Exception e)
            {                
                return new List<CloudQueueMessage>();
            }            
        }

由于

1 个答案:

答案 0 :(得分:1)

根据您的描述,我想原因是存储服务移动分区以改善负载平衡。

据我所知,azure存储分区服务器不只是托管一个分区(queue \ table partition-key),它将托管多个分区。

如果分区服务器收到太多请求,azure存储将自动改善负载平衡。

它会将一些分区移动到另一个分区服务器。如果在移动分区时发送reqeust,则会返回503错误。

有关天蓝色存储如何改善负载平衡的更多详细信息。你可以参考这个azure storage SOSP article's 5.5.1 Load Balance Operation Details

我建议您使用存储客户端库实施重试策略,以使您的程序正常运行。

更多细节,您可以参考以下文章: Microsoft.WindowsAzure.Storage.RetryPolicies Namespace