У меня есть приложение, размещенное @Heroku. Приложение зависит от некоторых каналов, которые извлекаются с помощью прослушивателя сокетов. Слушатель сокетов получает одну строку XML в секунду. Как только я обнаруживаю конец файлового сигнала от слушателя, я загружаю файл на серверы Amazon S3. Но до тех пор, пока не будет получен окончательный сигнал файла, возможно ли сохранить содержимое файла в качестве временного файла в Heroku?
Создание временных файлов в Heroku
Ответ 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"
Обратите внимание, что "нет гарантии, что этот файл будет присутствовать при последующих запросах (хотя это может быть), поэтому это не должно использоваться для какого-либо постоянного хранилища".