【问题标题】:Azure blob storage - Get Block List returns uncommitted blocks in the wrong orderAzure blob 存储 - 获取块列表以错误的顺序返回未提交的块
【发布时间】:2016-02-24 21:18:14
【问题描述】:

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

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

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

根据 Azure 存储 API 站点,

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

      SDK 对附加和页面有很好的分块支持,您可以在其中输入数据,然后将其放入。有了块当然也有分块,但状态是在客户端维护的。

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

    【讨论】:

    • 谢谢!我希望 API 会更新以匹配文档,但我知道这需要做更多的工作。我最终做的是使用元数据来保存未提交的块顺序。不幸的是,由于限制,我不能使用附加 blob 或 MS Azure 存储 SDK。
    • 很高兴你发现了一些有用的东西!您不能使用 SDK 的限制是什么?
    • 仍然没有更新...msdn.microsoft.com/en-us/library/azure/dd179400.aspx "返回未提交块列表,从最近上传的块开始到最旧的上传块。"
    【解决方案2】:

    您可以为每次调用 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);
    

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2020-06-25
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2011-09-07
      • 2023-03-03
      • 2018-06-05
      相关资源
      最近更新 更多