Azure表实体存在/同步

Azure表实体存在/同步,azure,error-handling,exists,azure-table-storage,Azure,Error Handling,Exists,Azure Table Storage,我正在使用azure表查询检索分配给用户的所有错误实体。 之后,我将实体的属性更改为声明该实体处于处理模式。 处理完实体后,我从表中删除该实体 当我进行并行测试时,可能会发生这样的情况:在查询过程中,一个实体已经被另一个线程处理并删除。因此,当我要替换实体时,会出现错误404 ResourceNotFound 如果实体在线程之外发生了更改,或者它仍然存在,是否有方法进行测试?捕捉错误404并忽略它更好吗?还是应该再次查询实体(对我来说似乎不合适) TableQuery query=new Tab

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

当我进行并行测试时,可能会发生这样的情况:在查询过程中,一个实体已经被另一个线程处理并删除。因此,当我要替换实体时,会出现错误404 ResourceNotFound

如果实体在线程之外发生了更改,或者它仍然存在,是否有方法进行测试?捕捉错误404并忽略它更好吗?还是应该再次查询实体(对我来说似乎不合适)

TableQuery query=new TableQuery().Where(TableQuery.GenerateFilterCondition(“PartitionKey”,QueryComparisons.Equal,user));
List queryResult=table.ExecuteQuery.OrderBy(x=>x.action.ToList();
foreach(queryResult中的ErrorObjectTableEntity实体)
{
entity.inProcess=true;
尝试
{
TableOperation updateOperation=TableOperation.Replace(实体);
表。执行(更新操作);
}
抓住
{
//…这里有些日志记录
//捕捉错误404?
}
//采取行动
尝试
{
TableOperation deleteOperation=TableOperation.Delete(实体);
表。执行(删除操作);
}
捕获{…}
}

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


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

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

掩盖其他类别的错误也是我关心的问题。不幸的是,我需要使用一个表,因为我需要为一个错误存储几个细节(列)。我必须关心实体的状态,因为我有inProcess列。。我是否应该将我的表与另一个表或队列合并?
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{...}
}