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

Bri*_*yer 2 c# rest azure azure-storage azure-storage-blobs

我有一个批量上传系统,我想执行以下操作:

  1. 将一大块数据上传到服务器,将其作为未提交的块放在块Blob上。
    • 上传者对块/ blob实现一无所知。它只是知道它正在存储大量数据。
    • 服务器也无法在调用之间保留任何状态。
  2. 一旦所有块都已上传(上传者在最后一个块上设置了一个标志),服务器将:
    1. 获取blob上未提交的块的列表(请记住,它无法保留状态,因此无法将该列表保留在内存中),然后
    2. 进行调用以提交它们(PutBlockList)。他们必须以正确的顺序来落实。

但是从API返回的块的顺序与文档中说明的顺序不同。

根据Azure存储API网站,

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

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

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

谢谢!

Emi*_*ner 5

我们在存储服务端检查了一下,这很重要:文档有一个错误。从第1天开始,未提交的块列表已按字母顺序返回。我们将尽快更新MSDN文档以消除错误,对于给您带来的不便,我们深表歉意!

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

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

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

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

    这些SDK对附录和页面具有强大的分块支持,您可以在其中插入数据并将其放入。当然也有块,但仍保持客户端状态。

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