gpt4 book ai didi

使用可能预先存在的行键进行Azure表存储批量插入

转载 作者:行者123 更新时间:2023-12-02 07:14:59 25 4
gpt4 key购买 nike

我正在尝试将一批简单的插入操作发送到 Azure 表存储,但似乎整个批处理事务已失效,并且使用托管 Azure 存储客户端,如果存在单个 ExecuteBatch 方法本身会引发异常将批处理插入到预先存在的记录中。 (使用2.0客户端):

public class SampleEntity : TableEntity
{
public SampleEntity(string partKey, string rowKey)
{
this.PartitionKey = partKey;
this.RowKey = rowKey;
}
}


var acct = CloudStorageAccount.DevelopmentStorageAccount;
var client = acct.CreateCloudTableClient();
var table = client.GetTableReference("SampleEntities");

var foo = new SampleEntity("partition1", "preexistingKey");
var bar = new SampleEntity("partition1", "newKey");

var batchOp = new TableBatchOperation();
batchOp.Add(TableOperation.Insert(foo));
batchOp.Add(TableOperation.Insert(bar));

var result = table.ExecuteBatch(batchOp); // throws exception: "0:The specified entity already exists."

使用 InsertOrMerge 可以避免批处理级异常,但每个单独的操作响应都会返回 204,无论该特定操作是否插入或合并它。因此,客户端应用程序似乎不可能保留自己或集群中的另一个节点是否插入了记录的信息。不幸的是,在我目前的情况下,这些知识对于某些下游同步是必要的。

是否有某种配置或技术可以允许批量插入继续进行并返回每个项目的特定响应代码而不抛出全面异常?

最佳答案

正如您所知,由于批处理是一种事务操作,您将获得一种“全有或全无”的交易。批量事务的一个有趣之处是您可以获得批处理中第一个失败实体的索引。因此,假设您尝试批量插入 100 个实体,并且表中已存在第 50 个实体,则批处理操作将为您提供失败实体的索引(在本例中为 49)。

Is there some configuration or technique to allow the batch of inserts to proceed and return the particular response code per-item without throwing a blanket exception?

我不这么认为。一旦第一个实体失败,交易就会失败。它甚至不会尝试处理其他实体。

可能的解决方案(只是大声思考:))

如果我理解正确,您的关键要求是确定实体是否被插入或合并(或替换)。为此,方法是从批处理中分离出失败的实体并单独处理它们。基于此,我可以想到两种方法:

  1. 在这种情况下,您可能会将该批处理分成 3 个批处理:第一批处理将包含 49 个实体,第二批处理将包含只有 1 个实体(失败),第三批将包含 50 个实体。您现在可以插入第一批中的所有实体,决定您想对失败的实体执行什么操作并尝试插入第三批。你需要一遍又一遍地重复这个过程直到该操作完成。
  2. 另一个想法是从批处理中删除失败的实体,然后重试该批处理。所以在上面的例子中,在你的第一次尝试中您将尝试 100 个实体,在第二次尝试中您将尝试 99 个实体实体等等 跟踪所有失败的实体同时(以及他们失败的原因)。一旦批量操作成功完成,您可以与所有失败的实体。

关于使用可能预先存在的行键进行Azure表存储批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16802546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com