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

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

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

Do the symptoms I'm seeing support my hypothesis that I'm hitting Azure Table Storage performance target thresholds? 我想确定我的工作重点是正确的方向 .

Edit :许多实际失败的查询都应该非常快:它们同时指定了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));

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

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