Загрузка 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
перл:
Далее я попытаюсь выполнить те же самые шаги, но с aws-sdk
gem, который выглядит так, как будто поддерживает заголовок HTTP Range