如何避免从 Azure 表存储中删除批处理时出现 404
本文关键字:批处理 删除 何避免 Azure 存储 | 更新日期: 2023-09-27 17:55:31
>问题
我正在尝试从表存储中删除大量可能存在也可能不存在的行。交易是我需要最小化 I/O 并最大化带宽,因此 1 次命中来统治它们会很棒。问题是,如果任何批处理实体不存在,则整个批处理将失败。
为什么
这也让我想到了一个设计问题 - 为什么请求不简单地返回删除结果,并指示哪些对象由于 404 而未被删除。为什么会引发异常?这是什么原因。
更多信息
批大小在表存储约束 100 范围内,并且它们都位于同一分区中。
要回答您的问题,没有办法避免这种情况。如果批处理中的实体失败,则整个批处理将失败。
但是,您可以做一件事:
当批处理失败时,它将返回失败实体的索引。您可以做的是获取该批次并从中创建 3 个单独的批次。第一批将从第一个实体(第 0 个索引)到失败实体的索引(减去 1),第二批将是失败实体(因此只有一个实体),最后一批将从失败实体索引到最后一个实体。对于失败的实体,您可以简单地尝试DeleteIfExists
。因此,假设一个批次中有 100 个实体,假设第 30 个实体失败,您将创建 3 个批次:
批次 1:第 0 至第 29 个实体(索引 0 - 28)
批次 2:第 30 个实体(单个实体)(索引 29)
第 3 批:第 31 至 100 个实体(索引 30 - 99)
这也让我想到了一个设计问题——为什么请求不 只需返回一个删除结果,并指示哪些对象是 由于 404 而未删除。为什么会引发异常?什么是 原因。
我能想到的一个可能原因是因为存储API对REST的遵守。您尝试删除资源,它不存在,因此 API 会抛出错误。此外,实体可能无法删除,不仅因为实体不存在,还因为请求中指定的if-match
条件标头不匹配。详细地说,您可能希望仅在eTag
匹配时才删除实体。在这种情况下,即使实体存在,删除操作也会失败。为了处理单个实体删除操作上的 404 错误,所有客户端 SDK 都实现了DeleteIfExists
类型的功能,这些功能将吞噬 404 错误。
您可以在删除空实体之前使用相同的分区键和实体键放置它们。这样,您将确保不会遇到 404 错误。这是对每个批处理的两个一致调用,而不是多次重试并使应用的逻辑复杂化。不是一个理想的答案,但我们不生活在一个理想的世界里:)