Загрузка AWS S3 Ruby Stream: Повторите попытку подключения во время загрузки чанка.

Мне было интересно, если кто-то может помочь мне с проблемой потоковой загрузки, которая у меня возникла?

В настоящее время у меня есть большой файл GZipped XML, хранящийся в корзине s3, который мне нужно ежедневно загружать, распаковывать и анализировать с помощью 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, которая запускает для меня скрипт ruby ​​(мой сайт Rails также развернут в Heroku). Локально работает, но примерно через час на Heroku (иногда меньше в зависимости от размера динамометрического стенда) сценарий завершается с этим сообщением об ошибке:

Errno::ECONNRESET: Connection reset by peer

Моя проблема в том, что, когда это не удается в середине моего потока, я не уверен, как повторить загрузку, начиная с чанка, где соединение было сброшено.

Документация Fog о поточной загрузке редка, и переключение на AWS SDK для Ruby, по-видимому, дает блоку еще меньше информации (т. Е. Никаких оставшихся или общих байтовых параметров).

Есть идеи? Заранее спасибо!

ОБНОВЛЕНИЕ 1

Моя последняя попытка включала отслеживание байтового расположения последнего блока, с которым работал (т.е. total_bytes - remaining_bytes) до сброса соединения. Туман позволяет установить пользовательский заголовок в параметре параметров 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, похоже, игнорировал этот заголовок, и после некоторого поиска я обнаружил, что он не является принятым атрибутом заголовка HTTP в fog-aws перл:

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

Далее я попытаюсь выполнить те же самые шаги, но с aws-sdk gem, который выглядит так, как будто поддерживает заголовок HTTP Range

0 ответов

Другие вопросы по тегам