【问题标题】:Azure: How to reliable download a file from blobstorage?Azure:如何可靠地从 blob 存储下载文件?
【发布时间】:2015-09-08 05:30:13
【问题描述】:

我们创建了很多 csv 文件并将它们存储在一个 azure blob 容器中。创建所有文件后,应将它们下载到 vpn 内的某个位置。这在大多数情况下都可以正常工作,但可能会发生某些文件比预期小得多的情况。

文件的平均大小约为 40 mb,有时文件在 7 到 30 mb 之间。这是到目前为止的代码:

private void DownloadBlobToFile(ICloudBlob blob, string fileName)
{
    _log.Debug("DownloadBlobToFile");
    Contract.Requires<ArgumentNullException>(blob == null, "blob must not be null.");
    Contract.Requires<ArgumentNullException>(string.IsNullOrWhiteSpace(fileName), "fileName must not be null or empty.");

    using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read))
    {
        blob.DownloadToStream(fileStream, null, GetBlobRequestOptions());
        _log.Info(string.Format("File {0} successfully downloaded.", fileStream.Name));
    }
}

private BlobRequestOptions GetBlobRequestOptions()
{
    if (_blobRequestOptions != null)
    {
        return _blobRequestOptions;
    }
    _blobRequestOptions = new BlobRequestOptions
    {
        ServerTimeout = TimeSpan.FromSeconds(60),
        MaximumExecutionTime = TimeSpan.FromSeconds(180),
        RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), 5)
    };
    return _blobRequestOptions;
}

当文件下载不完整时,根本没有错误消息。 检查文件是否已成功并完全下载的最佳程序是什么?

【问题讨论】:

  • Azure 存储客户端库有多种方法可以检查 blob 下载是否成功。例如,如果下载的字节数与 Content-Length 标头不匹配,则会抛出异常。那么,您是否在服务器端检查了 blob 是否实际完成,这意味着上传实际上是否成功?
  • 当然我检查了大小。完全没有例外,但文件之间的差异高达 30mb。看起来这是一个网络延迟问题。也许下载有效,但无法在目标位置创建文件?检查下载是否已完成的其他可能方法是什么?
  • 如果文件创建失败,FileStream 会抛出异常。如果下载的字节数不正确,DownloadToStream 会抛出异常。您是否尝试过运行 Fiddler 并查看服务器为 Content-Length 返回的内容?
  • 失败的情况并不常见。这些进程每小时运行一次,三天左右就会失败一次。所以很难复制。无论如何,谢谢你会试一试。
  • 设置 MaximumExecutionTime = TimeSpan.FromSeconds(180) 可能太短而无法完成下载。在那之后执行时间下载将被终止!所以,把这个设置为TimeSpan.FromMinutes(60),应该就够了。

标签: azure blob azure-storage


【解决方案1】:

不确定您是否可以控制文件名,但如果可以,您可以使用文件内容的 MD5 哈希来命名文件。然后,您可以在文件下载时计算该 MD5 哈希,以确保它与文件名匹配。这样你就会知道你是否拥有所有的内容。您也可以将此元数据存储在其他地方并将其关联,但关键是使用 MD5 哈希来验证您拥有您期望拥有的一切。

【讨论】:

  • 问题是,博客容器可能已完成下载,但文件尚未完全写入 vpn 网络中的文件位置。 md5 是一个有价值的想法,我会尝试一下。从我的角度来看,问题是完成检查的时间点。
猜你喜欢
  • 2018-04-25
  • 1970-01-01
  • 2021-12-08
  • 2020-08-08
  • 1970-01-01
  • 2018-11-07
  • 2015-06-20
相关资源
最近更新 更多