繁体   English   中英

Azure表实体存在/同步

[英]Azure table entity existence/synchronisation

我正在使用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{...}
}

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

即使在执行替换之前检查了该实体是否存在,如果在检查和替换调用之间已将其删除,则仍然需要捕获NotFound错误。 因此,您最好跳过检查。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM