2009-10-26 5 views
9

У меня вопрос о размещении больших динамически генерируемых активов и Heroku.Heroku: обслуживание больших динамически генерируемых активов без локальной файловой системы

Мое приложение будет предлагать массовую загрузку поднабора его базовых данных, который будет состоять из большого файла (> 100 МБ), создаваемого один раз каждые 24 часа. Если бы я работал на сервере, я бы просто записал файл в общий каталог.

Но, как я понимаю, это невозможно с Героку. Каталог/tmp может быть записано, но гарантированное время жизни файлов там seems to be defined с точки зрения одного цикла запроса-ответа, а не фонового задания.

Я хотел бы использовать S3 для размещения файла загрузки. S3 gem поддерживает потоковые загрузки, но только для файлов, которые уже существуют в локальной файловой системе. Похоже, что размер контента должен быть известен заранее, что в моем случае невозможно.

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

С учетом приложения Rails, в котором я не могу писать в локальную файловую систему, как я могу обслуживать большой файл, создаваемый ежедневно, без создания большой строки в памяти?

+0

У меня такая же проблема. Я еще не занимался этим, но я предполагал, что могу писать в файловую систему/tmp у моего работника delayed_job, и он будет стоять достаточно долго, чтобы загрузить файл на S3. Интересно услышать, что предлагают люди! –

ответ

10

${RAILS_ROOT}/tmp (не/TMP, это в каталог приложения) продолжается на протяжении процесса. Если вы используете фоновый DJ, файлы в TMP будут длиться в течение всего этого процесса.

На самом деле файлы продлятся дольше. Причина, по которой мы говорим, что вы не можете гарантировать доступность, заключается в том, что tmp не используется на серверах, и каждое задание/процесс может выполняться на другом сервере на основе облачной нагрузки. Вам также необходимо убедиться, что вы удаляете свои файлы, когда вы закончите с ними, как часть задания.

-Другой сотрудник Heroku

+0

@teich, это имеет смысл- спасибо! –

3

Рич,

Вы пробовали писать файл ./tmp затем потокового файла на S3?

-Blake Mizerany (Heroku)

+0

@Blake, я не пробовал, потому что документация Heroku в каталоге/tmp (связанная выше) говорит (из того, что я могу сказать), что содержимое каталога сохранится в течение одного запроса. То, что я буду делать, будет в контексте фоновой работы, которая, похоже, требует неприятностей. Если я ошибаюсь, то великий - это решит проблему. –