C# Azure队列限制错误,请求很少(StorageException:服务器正忙)
语言:C#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: 服务器正
- 我的消息是小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个请求/秒)。请参阅我的图表(当出现下降时,是我的一个程序收到“服务器正忙”错误)所以我不明白我为什么会遇到这个问题……再补充一点,表存储对每个分区都有限制。如果在一个分区中有数百万条记录,并且事务量很大,那么您将受到限制。如果您对表存储数据进行分区,您可以通过分散到多个分区(每个分区都有)来实现更高的吞吐量我们有自己的服务限额。