Azure blob存储-Get Block List按错误顺序返回未提交的块

本文关键字:返回 顺序 提交 错误 存储 blob -Get Block List Azure | 更新日期: 2023-09-27 18:23:55

我有一个批量上传系统,我想做以下事情:

  1. 将数据块上载到服务器,服务器会将其作为块blob上的未提交块。
    • 上传程序无法了解有关block/bob实现的任何信息。它只知道自己在存储一大块数据
    • 服务器也无法在调用之间保留任何状态
  2. 一旦上传了所有区块(上传者在最后一个区块上设置了一个标志),服务器将:
    1. 获取blob上未提交块的列表(请记住,它无法保留状态,因此无法将此列表保存在内存中),然后
    2. 调用以提交它们(PutBlockList)<他们必须按正确的顺序提交>

但是从API返回的块的顺序并不是文档所说的顺序

根据Azure存储API网站,

未提交块的列表从最近上传的块开始返回到最旧上传的块。(https://msdn.microsoft.com/en-us/library/azure/dd179400.aspx,在底部的备注部分下)

然而,原始API调用和Microsoft Azure Storage SDK都以字母顺序返回块,而不是以任何方式上传的顺序返回块。

我读错文件了吗?这可能是API中的错误吗?本地存储模拟器也给出了相同的结果。

谢谢!

Azure blob存储-Get Block List按错误顺序返回未提交的块

我们在存储服务端检查了一下,结果是:文档有一个错误。自第一天起,未提交区块的列表已按字母顺序返回。我们将尽快更新MSDN文档以删除错误,对此给您带来的不便,我们深表歉意!

以下是解决问题的一些想法:

  1. 如果您不能在本地保留任何状态,请尝试与将块id存储在云中的put块调用并行。我建议使用附加blob来存储这些
  2. 探索其他一些blob类型。

    • 如果你想按照上传的顺序写入数据,那么附加blob可能会更好。附加Blob与块Blob具有相同的读取行为和吞吐量,但不允许更新或删除已经放置的块。但是,要附加数据,只需要一个appendBlock,它将添加到blob的末尾——不需要提交!

    • 页面Blob还允许您在不提交的情况下放置数据。与附加blob不同,它们将允许在blob的中间进行修改。然而,它们对数据长度可被512整除有严格的限制。因此,如果这不是数据的自然属性,则需要处理填充。

    SDK对append和page有很好的分块支持,你只需输入数据,它就会被放入。对于block,当然也有分块,但状态是在客户端维护的。

  3. 使用字母排序属性,使您的块id按字母顺序排列。块id必须是有效的base64字符串,小于64字节,并且每个块的长度相同。然后,您可以按照最初的想法使用返回的阻止列表

您可以为每个blob调用传递增量blockId(或chunkId)。PutBlock:

var blockCount = 0;
...
var blockId = Convert.ToBase64String(BitConverter.GetBytes(blockCount));
blob.PutBlock(blockId, ms, null);
blocksCount++;

然后通过知道传输块的数量来提交它们:

var blockIds = Enumerable.Range(0, blocksCount).Select(b => Convert.ToBase64String(BitConverter.GetBytes(b)));
blob.PutBlockList(blockIds);