【问题标题】:Are append operations on an AppendBlob atomic?AppendBlob 上的追加操作是原子的吗?
【发布时间】:2016-05-19 13:01:04
【问题描述】:

我正在使用附加 blob 来存储一个大的二进制文件。我将文件分成几部分(每个部分小于 4 MB)并附加它们以使其再次完整。如果在此过程中追加操作失败,文件中是否有任何来自此失败的追加尝试的残留物?还是这个追加操作是原子的?

【问题讨论】:

  • 您是在使用Append Blobs 还是在Block Blob 上进行分块上传?
  • AppendBlob 上的 AppendFromStreamAsync

标签: azure atomic azure-blob-storage


【解决方案1】:

使用Append Blob,只要将块写入 blob,它就会被提交并更改 blob 的大小。因此,在您的场景中,假设您已将源文件分成 10 个部分并附加这些部分。让我们进一步假设第 1 - 4 部分成功,第 5 部分失败,然后第 6 - 10 部分成功。在这种情况下,您将得到一个包含 1-4 和 6-10 部分的损坏 blob。因为在 Append Blob 中,内容总是附加到 Blob 的现有内容中,所以您无法为第 5 部分插入正确的数据。

考虑到这种情况,我不建议使用Append Blobs。 Append Blob 的用例绝对不是这个。 我建议为此使用Block Blob。使用 Block Blob,您放置第 1 至第 4 部分,然后第 5 部分失败,然后整个上传操作将失败。使用块 Blob,Azure 存储将上传但未提交的块保留 14 天。因此,如果您想从第 5 部分恢复上传,您将从 Azure 获取有关未提交块的信息,然后从第 5 部分重新开始上传。上传其余部分后,您可以指示 Azure 将这些块放在一起(使用 Put Block List 操作)以创建 blob。

【讨论】:

  • 如果第5部分失败时抛出异常,则没有问题。我将尝试在第 6 部分之前附加第 5 部分。这种情况下可以吗?
  • 使用附加 Blob,您不能。内容始终添加到 blob 的末尾。因此,如果第 5 部分失败而第 6 部分成功,则基本上第 6 部分将成为 blob 中的第 5 部分,然后当您上传第 5 部分时,它将成为 blob 中的最后一部分。
  • 我不想在第 5 次成功之前追加第 6 次。
  • 啊...所以如果我理解正确,如果第 5 次失败,您的操作将失败。我对么?但我的回答仍然成立。为 Append Blob 上传第一部分后,就会在 Azure 存储中为您创建一个持久 Blob。
  • 失败的尝试没有留下任何东西。
【解决方案2】:

如果存储服务返回失败代码,则失败的尝试不会留下任何内容。这假设“尝试”意味着单个存储服务调用(例如追加 4MB 块)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2015-01-10
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多