我正在调试我的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));
我认为这可能是最可能的罪魁祸首。我知道它需要扫描整个分区。每个分区可能有数百或数千行。
如果我的原始问题不准确,我道歉。让我重新说一下。假设我的一些查询确实导致了大型表扫描,是否会导致溢出效应并导致其他查询失败?提前谢谢。