Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Azure队列限制错误,请求很少(StorageException:服务器正忙)_C#_Azure_Azure Storage_Azure Storage Queues - Fatal编程技术网

C# Azure队列限制错误,请求很少(StorageException:服务器正忙)

C# Azure队列限制错误,请求很少(StorageException:服务器正忙),c#,azure,azure-storage,azure-storage-queues,C#,Azure,Azure Storage,Azure Storage Queues,语言:C# 框架:.NET核心1.1.1 Nuget:WindowsAzure.Storage版本8.1.1 嗨 我在Azure上使用队列存储。 我有4个程序,每秒钟发出1个请求(GetMessagesAsync请求)。 因此,我每秒钟提出4个请求 但有时会出现导致此异常的限制错误: System.AggregateException:发生一个或多个错误。(服务器正在运行。) 忙。)-->Microsoft.WindowsAzure.Storage.StorageException: 服务器正

语言:C#

  • 框架:.NET核心1.1.1

  • Nuget:WindowsAzure.Storage版本8.1.1

  • 我在Azure上使用队列存储。 我有4个程序,每秒钟发出1个请求(GetMessagesAsync请求)。 因此,我每秒钟提出4个请求

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

    System.AggregateException:发生一个或多个错误。(服务器正在运行。) 忙。)-->Microsoft.WindowsAzure.Storage.StorageException: 服务器正忙。\r\n在 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.d_u4`1.MoveNext()\r\n--- 来自引发异常的上一个位置的堆栈结束跟踪 ---\r\n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)\r\n位于 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n位于 Microsoft.WindowsAzure.Storage.Queue.CloudQueue.c\u DisplayClass83\u 0.d.MoveNext()\r\n

    考虑到单个队列的Azure目标吞吐量高达每秒2000封邮件,我不知道为什么会出现此错误。

    其他信息:

    • 我的消息是小json文件(1ko大小)
    • 我在azure门户上进行了检查,在7天内,我的程序发出了220万个请求(~3.6个请求/秒)
    • 当我遇到“服务器正忙”异常时,我的azure门户中也会出现节流错误
    我的函数,我在其中获取:

    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>();
                }            
            }
    
    受保护的异步任务GetAndDequeueMessagesAsync(int numberOfMessagesToRetrived=1){
    尝试
    {
    IEnumerable messages=等待GetMessagesAsync(numberOfMessagesToRetrived);
    foreach(消息中的CloudQueueMessage queueMessage)
    {
    等待DequeueMessageAsync(queueMessage);
    }
    返回消息;
    }
    捕获(例外e)
    {                
    返回新列表();
    }            
    }
    

    谢谢

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

    据我所知,azure存储分区服务器将不仅仅承载一个分区(队列\表分区键),它还将承载多个分区

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

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

    有关azure存储如何改进负载平衡的更多详细信息。你可以参考这个

    我建议您可以使用存储客户机库实施重试策略,以保持程序正常运行

    更多详细信息,请参阅以下文章:

    在我看来,如果您每秒一次发送的请求太多。存储服务器将返回503错误。您是否启用了分钟度量[对于队列存储?我建议您可以启用它。您可以看到每分钟有许多请求。如果数量超过2000,存储将返回503。另一个是其他一些程序使用了相同的队列,并且每秒匹配2000条消息。我建议您也可以检查它。谢谢您的回答。正如我在帖子中所说,我已经检查过了这些指标是7天内2.2百万个请求。这是~3.6个请求/秒。与azure允许的每秒2000条消息相比,这是一个荒谬的数字。第二点,azure中的指标是针对队列的,与使用它的程序的数量无关。在我看来,7天内2.2百万个请求并不意味着每秒3.6个请求。这是仅为平均值。此外,存储还具有以下目标:每个存储帐户的最大请求速率:队列:每秒20000条消息(假设消息大小为1KB)。如果超出此值,它也会显示错误。据我所知,azure storage不会在您超出目标后立即返回503错误。如果您超出目标一段时间(约1分钟),它将返回503错误。基本上,我有4个程序每秒发出一个请求(这是一个1秒睡眠的循环)。这样,我的请求使用率是“稳定的”。没有峰值使用率。每小时,我发出约14k个请求(即约3.8个请求/秒)。请参阅我的图表(当出现下降时,是我的一个程序收到“服务器正忙”错误)所以我不明白我为什么会遇到这个问题……再补充一点,表存储对每个分区都有限制。如果在一个分区中有数百万条记录,并且事务量很大,那么您将受到限制。如果您对表存储数据进行分区,您可以通过分散到多个分区(每个分区都有)来实现更高的吞吐量我们有自己的服务限额。