什么可能导致对Azure表存储的42秒失败调用?

时间:2016-11-14 04:22:14

标签: azure azure-table-storage

我正在调试我的Azure网络应用程序的问题。从它到Azure表存储的某些调用花费了很长时间然后失败。

查看我的Application Insights仪表板,看来大多数失败的调用都是针对几个特定的​​表,即包含大量数据的表。似乎一旦一个呼叫失败,其他几个呼叫同时失败,因此故障一次发生为大约五或六个呼叫的集群,通常在同一秒内。失败的呼叫通常在21或42秒后失败。

我开始怀疑这可能是因为达到每个分区2K项目或每秒20K项目的性能目标阈值。文档说,当发生这种情况时,Azure表存储将开始发送500和503错误。不幸的是,Application Insights中的Result Code字段显示<undefined>失败的呼叫,因此我无法确认其实际情况。 (或者也许电话超时并在收到回复之前被取消。)

我看到的症状是否支持我的假设,即我达到了Azure Table存储性能目标阈值?我想确保我的工作重点放在正确的方向上。

编辑:许多实际失败的查询都应该非常快:它们同时指定了PartitionKey和RowKey。我怀疑在达到性能目标阈值后,即使这些查询都失败了。

在回复评论时,以下是一些我最怀疑的问题:

var filter =
    TableQuery.CombineFilters(
        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.GreaterThanOrEqual, UserArticleViewEntity.GeneratePartitionKeyRangeStart(userID)),
        TableOperators.And,
        TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.LessThanOrEqual, UserArticleViewEntity.GeneratePartitionKeyRangeEnd(userID))
    );

这将生成一系列分区的查询,这些分区都以相同的前缀开头。可能有数十到数百个分区。每个分区通常包含一个或两个实体。

string filter = TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, userID);
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForDate("NextDueDate", QueryComparisons.GreaterThanOrEqual, dueDateGreaterThanOrEqualTo));
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForDate("NextDueDate", QueryComparisons.LessThanOrEqual, dueDateLessThanOrEqualTo));
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForDate("WhenUpdated", QueryComparisons.GreaterThanOrEqual, lastEncounteredGreaterThanOrEqualTo));
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForDate("WhenUpdated", QueryComparisons.LessThanOrEqual, lastEncounteredLessThanOrEqualTo));
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForInt("Q", QueryComparisons.GreaterThanOrEqual, qGreaterThanOrEqualTo));
filter = TableQuery.CombineFilters(filter, TableOperators.And, TableQuery.GenerateFilterConditionForInt("Q", QueryComparisons.LessThanOrEqual, qLessThanOrEqualTo));

我认为这可能是最可能的罪魁祸首。我知道它需要扫描整个分区。每个分区可能有数百或数千行。

如果我的原始问题不准确,我道歉。让我重新说一下。假设我的一些查询确实导致了大型表扫描,是否会导致溢出效应并导致其他查询失败?提前谢谢。

0 个答案:

没有答案