Подтвердить что ты не робот

Создание временных файлов в Heroku

У меня есть приложение, размещенное @Heroku. Приложение зависит от некоторых каналов, которые извлекаются с помощью прослушивателя сокетов. Слушатель сокетов получает одну строку XML в секунду. Как только я обнаруживаю конец файлового сигнала от слушателя, я загружаю файл на серверы Amazon S3. Но до тех пор, пока не будет получен окончательный сигнал файла, возможно ли сохранить содержимое файла в качестве временного файла в Heroku?

4b9b3361

Ответ 1

Возможно, вы сможете использовать каталог #{RAILS_ROOT}/tmp/ или Rails.root.join('tmp').to_s:

Аспен и Бамбук
[...]
Существует два каталога, которые можно записать: ./tmp и ./log (под вашим корнем приложения).
[...]

Кедр
Cedar предлагает эфемерную записываемую файловую систему. Вы можете записывать на диск в любом месте. Ваши изменения будут потеряны при перезагрузке и развороте динозавра.

RAILS_ROOT предназначен для более старых версий Rails, Rails.root предназначен для более новых версий.

Вы не можете зависеть от чего-либо, переживающего запросы, конечно, нет гарантии, что вы даже будете работать с одним и тем же dyno.

Если вы остаетесь в рамках одного процесса или запроса, Rails.root.join('tmp') должен использоваться. Если вам нужны временные данные, чтобы выжить по запросам или процессам, вам лучше использовать что-то другое (например, MongoDB или PostgreSQL) в качестве сборника для ваших данных на пути к S3.


Благодарим Бенджамин Уилер за хедшоу о смене RAILS_ROOT до Rails.root.

Ответ 2

Документация на файловой системе только для чтения Heroku объясняет, что вы можете использовать #{RAILS_ROOT}/tmp, но не приводят примеры для генерации временного имени файла. Это гарантирует уникальность имени файла:

prefix = 'mydata'
suffix = '.xml'
Tempfile.new [prefix, suffix], "#{Rails.root}/tmp"

Обратите внимание, что "нет гарантии, что этот файл будет присутствовать при последующих запросах (хотя это может быть), поэтому это не должно использоваться для какого-либо постоянного хранилища".