AppendBlob 上的追加操作是原子的吗?

Are append operations on an AppendBlob atomic?

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

使用 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。

如果存储服务 returns 失败代码,则失败的尝试不会留下任何东西。这假设 'attempt' 表示单个存储服务调用(例如追加 4MB 块)。