2017-02-15 15 views
0

У меня есть список задач, которые должны быть выполнены в фоновом режиме (Rails 5.0.1) в следующемDaemon против Runner против Rake задач против активной Работы

порядка-
  1. Скачать почтовый файл
  2. Извлеките файл XML из него (ср. размер ~ 400 MB)
  3. Анализировать (Nokogiri XML :: читатель) файл XML для записей, удовлетворяющих определенным ограничениям, и если найден, добавить их в базу данных (Postgres)
  4. Получить некоторые адреса электронной почты из базы данных и отправить их по электронной почте

Это нужно делать каждый день без какого-либо человеческого ввода. Прямо сейчас, я использую Rails runner, чтобы сделать все это и планировать его, используя cron («Whenever» gem). Таким образом, используется 'бегун' правый подход? Есть ли менее интенсивный объем памяти подход, который я могу использовать, учитывая, что интерфейс (панель администратора) будет недоступен? Как насчет активной работы, рейка, демонов и т. Д.?

+0

Разбор XML будет узким местом, независимо от того, как вы планируете работу. Если вам нужен менее интенсивный подход к памяти, попробуйте найти что-то, что не включает в себя синтаксический анализ файла размером 400 МБ в память. – max

+0

@max В настоящее время я использую XML-ридер Nokogiri, который не загружает xml в память, а читает строки последовательно, анализируя узлы. Есть ли лучшее решение? Может быть, расщепление xml-файла? – rohank

ответ

1

. Задача грабли - это всего лишь куча кода внутри пространства имен, которое выполняется с помощью инструмента управления граблими

. runner запускает код Ruby в контексте Rails неинтерактивно

. Daemon, с другой стороны, совершенно другой, чем этот два, вы можете узнать об этом подробнее: http://daemons.rubyforge.org/

Для вашего случая лучше использовать рейк, потому что он не загружает рельсы «если вы не сделаете это» (бегун имеет для загрузки рельсов).

Другое дело, что грабли однопоточные, поэтому, если вы хотите, чтобы одна задача выполнялась эффективно, вы можете использовать рейк, если у вас есть несколько задач, вы можете использовать рабочих и инструменты, такие как Sidekiq, Resque и Delayed jobs

+0

Но когда файл xml разбирается, он также обновляет базу данных новыми записями. Так, не так ли, мне придется загружать рельсы (производство env) в любом случае, если я использую грабли? Как я могу использовать рейк с моделями, доступными для обновления? – rohank

+0

Я не знаю вашего точного usecase, вам может понадобиться загружать Rails, но вы также можете сохранить все эти записи, которые необходимо обновить в отдельном задании (с помощью отложенных заданий или Sidekiq). Таким образом, у вас задача грабли занимает всего время разбора. и задание, стоящее в очереди, единственное время, затраченное только на синтаксический анализ – amrdruid