Azure blob存储-Get Block List按错误顺序返回未提交的块
本文关键字:返回 顺序 提交 错误 存储 blob -Get Block List Azure | 更新日期: 2023-09-27 18:23:55
我有一个批量上传系统,我想做以下事情:
- 将数据块上载到服务器,服务器会将其作为块blob上的未提交块。
- 上传程序无法了解有关block/bob实现的任何信息。它只知道自己在存储一大块数据
- 服务器也无法在调用之间保留任何状态
- 一旦上传了所有区块(上传者在最后一个区块上设置了一个标志),服务器将:
- 获取blob上未提交块的列表(请记住,它无法保留状态,因此无法将此列表保存在内存中),然后
- 调用以提交它们(PutBlockList)<他们必须按正确的顺序提交>他们必须按正确的顺序提交>
但是从API返回的块的顺序并不是文档所说的顺序
根据Azure存储API网站,
未提交块的列表从最近上传的块开始返回到最旧上传的块。(https://msdn.microsoft.com/en-us/library/azure/dd179400.aspx,在底部的备注部分下)
然而,原始API调用和Microsoft Azure Storage SDK都以字母顺序返回块,而不是以任何方式上传的顺序返回块。
我读错文件了吗?这可能是API中的错误吗?本地存储模拟器也给出了相同的结果。
谢谢!
我们在存储服务端检查了一下,结果是:文档有一个错误。自第一天起,未提交区块的列表已按字母顺序返回。我们将尽快更新MSDN文档以删除错误,对此给您带来的不便,我们深表歉意!
以下是解决问题的一些想法:
- 如果您不能在本地保留任何状态,请尝试与将块id存储在云中的put块调用并行。我建议使用附加blob来存储这些
-
探索其他一些blob类型。
-
如果你想按照上传的顺序写入数据,那么附加blob可能会更好。附加Blob与块Blob具有相同的读取行为和吞吐量,但不允许更新或删除已经放置的块。但是,要附加数据,只需要一个appendBlock,它将添加到blob的末尾——不需要提交!
-
页面Blob还允许您在不提交的情况下放置数据。与附加blob不同,它们将允许在blob的中间进行修改。然而,它们对数据长度可被512整除有严格的限制。因此,如果这不是数据的自然属性,则需要处理填充。
SDK对append和page有很好的分块支持,你只需输入数据,它就会被放入。对于block,当然也有分块,但状态是在客户端维护的。
-
- 使用字母排序属性,使您的块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);