Azure 表实体存在/同步

Posted

技术标签:

【中文标题】Azure 表实体存在/同步【英文标题】:Azure table entity existence/synchronisation 【发布时间】:2013-09-13 11:47:44 【问题描述】:

我正在使用 azure 表查询来检索分配给用户的所有错误实体。 之后我更改实体的属性以声明实体处于处理模式。 处理完实体后,我从表中删除实体。

当我进行并行测试时,可能会在查询期间发生一个实体已被另一个线程处理和删除的情况。因此,当我想替换实体时,我收到错误 404 ResourceNotFound。

有没有办法测试实体是在线程之外更改还是仍然存在?捕获错误 404 并忽略它更好还是我应该再次查询实体(似乎对我来说都不合适)?

TableQuery<ErrorObjectTableEntity> query = new TableQuery<ErrorObjectTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, user));
List<ErrorObjectTableEntity> queryResult = table.ExecuteQuery(query).OrderBy(x => x.action).ToList();
foreach (ErrorObjectTableEntity entity in queryResult)

     entity.inProcess = true;
     try
     
         TableOperation updateOperation = TableOperation.Replace(entity);
         table.Execute(updateOperation);     
      
      catch
      
          //..some logging here
          //catch error 404?
      
      //do some action
      try
      
          TableOperation deleteOperation = TableOperation.Delete(entity);
          table.Execute(deleteOperation);
      
      catch...

【问题讨论】:

【参考方案1】:

就最佳实践而言,这里有几个问题。假设另一个工作人员将其删除,您编写的代码可以简单地忽略异常,但这最终可能会掩盖其他类别的错误。一种解决方案是使用队列为每个用户查询插入消息,然后让各种工作人员检索消息并处理特定用户的查询。这样,如果一个节点出现故障,应用程序将吸收故障并继续运行。此外,这将防止您的工作人员重复工作,从而优化整个应用程序。最后,如果您不关心实体的状态并且键是可预测的,您可以使用 Merge 语义来简单地更新实体的给定属性,而无需替换整个事物。

【讨论】:

掩盖其他类别的错误也是我关心的问题。不幸的是,我需要使用一个表格,因为我需要为错误存储几个详细信息(列)。而且我确实必须关心实体的状态,因为我有 inProcess 列。我应该将我的表与另一个表或队列合并吗?【参考方案2】:

您应该只捕获 404 错误。尽管它们在 .NET 中表示为异常,但 HTTP 4xx 错误代码比异常提供的信息更多。 (5xx 错误代码是例外的。)

即使您在进行替换之前检查了实体是否存在,您仍然需要捕获 NotFound 错误,以防它在检查和替换调用之间被删除。所以你不妨跳过检查。

【讨论】:

以上是关于Azure 表实体存在/同步的主要内容,如果未能解决你的问题,请参考以下文章

Python:Azure 存储表在存在时无法插入批处理项

Azure 表存储 - 表服务查询以检索并返回 10 个实体,直到最后一个实体

访问 azure 表实体

使用 azure 数据工厂管道将 json 对象存储到 azure 表存储实体

从 APIM 策略获取 Azure 表存储实体

查找对 Azure 存储表的删除实体调用