Периодически импортировать данные из файлов на Heroku

#import #cron #heroku

#импорт #cron #heroku

Вопрос:

Мне нужно периодически импортировать некоторые данные в мое приложение rails на Heroku.

Выполняемая задача разбита на следующие части: * загрузите большой zip-файл (например, ~ 100 мб) с веб-сайта * разархивируйте файл (распакованное пространство составляет ~ 1,50 гб) * запустите скрипт rake, который считывает эти файлы и создает или обновляет записи, используя мои модели активных записей * очистка

Как я могу это сделать на heroku? Лучше ли использовать какое-либо внешнее хранилище (например, S3). Как бы вы подошли к такой вещи?

В идеале это должно выполняться каждую ночь.

Ответ №1:

Пару дней назад я пробовал то же самое, и вывод, к которому я пришел, заключался в том, что это невозможно сделать из-за ограничений по объему памяти, которые heroku накладывает на каждый процесс. (Я создаю структуру данных из файлов, которые я читаю из Интернета, и пытаюсь перенести в DB)

Я использовал задачу rake, которая извлекала и анализировала пару больших файлов, а затем заполняла базу данных.

В качестве обходного пути я запускаю эту задачу rake на своем локальном компьютере сейчас и загружаю базу данных в S3 и выполняю команду heroku со своего локального компьютера для восстановления экземпляра heroku DB.

 "heroku pgbackups:restore 'http://s3.amazonaws.com/#{yourfilepath}' --app  #{APP_NAME} --confirm #{APP_NAME}"
  

Вы могли бы перейти на S3 с помощью библиотеки fog

 require 'rubygems'
require 'fog'
connection = Fog::Storage.new(
    :provider              => 'AWS',
    :aws_secret_access_key => "#{YOUR_SECRECT}",
    :aws_access_key_id     => "#{YOUR_ACCESS_KEY}"
)

directory = connection.directories.get("#{YOUR_BACKUP_DIRECTORY}")

# upload the file
file = directory.files.create(
    :key    => '#{REMOTE_FILE_NAME}',
    :body   => File.open("#{LOCAL_BACKUP_FILE_PATH}"),
    :public => true
)
  

Команда, которую я использую для создания pgbackup на моем локальном компьютере, это

 system "PGPASSWORD=#{YOUR_DB_PASSWORD} pg_dump -Fc --no-acl --no-owner -h localhost -U #{YOUR_DB_USER_NAME} #{YOUR_DB_DATABSE_NAME} > #{LOCAL_BACKUP_FILE_PATH}"
  

Я поставил задачу rake, которая автоматизирует все эти шаги.

После того, как вы могли бы попробовать, это использовать worker (DelayedJob). Я думаю, вы можете настроить своих рабочих так, чтобы они запускались каждые 24 часа. Я думаю, что у рабочих нет ограничения в 30 секунд. Но я не уверен в использовании памяти.