Azure blob存储 - 获取阻止列表以错误的顺序返回未提交的块

时间:2015-11-22 20:16:07

标签: c# rest azure azure-storage azure-storage-blobs

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

  1. 将一大块数据上传到服务器,该服务器将其作为块blob上的未提交块。
    • 上传者对块/ blob实现一无所知。它只知道它存储了一大块数据。
    • 服务器无法在调用之间保留任何状态。
  2. 一旦上传了所有块(上传者在最后一个块上设置了一个标志),服务器将:
    1. 获取blob上未提交的块的列表(记住,它不能保留状态,因此它不能将此列表保留在内存中)然后
    2. 调用提交它们(PutBlockList)。 他们必须以正确的顺序提交。
  3. 但是从API返回的块的顺序不是文档所说的顺序。

    根据Azure存储API网站,

      

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

    但是,原始API调用以及Microsoft Azure存储SDK都按字母顺序返回块,而不是按照以任何方式上载的顺序。

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

    谢谢!

2 个答案:

答案 0 :(得分:4)

我们检查了存储服务方面的问题,这是交易:文档有一个错误。从第1天开始,已按字母顺序返回未提交块的列表。我们会尽快更新MSDN文档以消除错误,对于给您带来的任何不便,我们深表歉意!

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

  1. 如果您无法在本地保留任何状态,请尝试与存储块ID的put块调用并行处理。我建议使用append blob来存储这些内容。
  2. 探索其他一些blob类型。

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

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

    SDK对append和page有很好的分块支持,你只需要输入数据就可以了。当然还有块,但是状态仍然是客户端。

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

答案 1 :(得分:0)

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

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);