AWS S3 Ruby Stream下载:在块下载期间重试连接

时间:2018-04-22 23:49:33

标签: ruby amazon-s3 aws-sdk aws-sdk-ruby fog-aws

我想知道是否有人可以帮我解决我遇到的流媒体下载问题?

目前我有一个存储在s3存储桶中的大型GZipped XML文件,我需要使用ruby每天下载,解压缩和解析。由于文件的大小,我选择以块的形式下载大文件,并在每个块上执行必要的解析,如下所示:

module S3Stream
  def self.call(credentials)
    Enumerator.new do |yielder|
      connection = Fog::Storage.new(credentials)
      bucket = connection.directories.new(key: 'bucket_name')

      bucket.files.get('file_name.tar.gz') do |chunk, remaining_bytes, total_bytes|
        yielder << chunk
      end
    end
  end
end

返回Enumerator对象允许我稍后在脚本中处理块的每个部分(即解压缩并解析其中包含的XML)

这一切都需要按计划运行,所以我有一个独立的Heroku dyno为我运行ruby脚本(我的Rails站点也部署到Heroku)。它在本地运行正常,但在Heroku上大约一个小时后(有时更少取决于dyno的大小)脚本失败并显示以下错误信息:

Errno::ECONNRESET: Connection reset by peer

我的问题是,当我的流中间出现故障时,我不确定如何从重置连接的块开始重试下载。

Fog的流下载文档很少,切换到适用于Ruby的AWS开发工具包似乎可以为该块提供更少的信息(即没有剩余或总字节数参数)。

有什么想法吗?提前谢谢!

更新1

我最近的尝试涉及在连接重置之前跟踪最后一个块的字节位置(即total_bytes - remaining_bytes)。 Fog允许您在get方法的选项参数中设置自定义标题:

  bucket.files.get('file_name.tar.gz', header: {'Range' => "bytes=#{@last_byte}-"}) do |chunk, remaining_bytes, total_bytes|
    yielder << chunk
  end

因此,当流重置时,我会尝试通过使用HTTP Range标头从新的流中离开的位置进行选择。

然而,Fog似乎忽略了这个标题,经过一些挖掘后我发现它不是fog-aws gem中可接受的HTTP标头属性:

https://github.com/fog/fog-aws/blob/ab8b720a277712b0d924be74c4db1502692efa44/lib/fog/aws/models/storage/file.rb#L12-L27

接下来,我将尝试使用aws-sdk gem执行相同的步骤,看起来它支持HTTP Range标头

0 个答案:

没有答案