Каков наилучший способ запустить фоновый процесс в Rails 5? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть веб-приложение, в котором мне нужно выполнить процесс, который занимает некоторое время (обычно 1 минута).

Я попытаюсь объяснить это кратко: в моем приложении у меня есть алгоритм, которыйприсваивает внешние ключи набору объектов на основе набора параметров (в основном, дат).Когда пользователь нажимает назначенную кнопку внутри моего приложения, выполняется метод контроллера.Внутри этого метода я выполняю вызов метода в модели, где обрабатывается вся логика и назначаются ключи.Как упоминалось ранее, весь процесс занимает около минуты.

Итак, мой вопрос: как лучше всего запустить этот процесс в фоновом режиме в Rails 5?Я, очевидно, не хочу заставлять своих пользователей ждать целую минуту, прежде чем они смогут перемещаться по приложению, и я также не хочу, чтобы приложение истекло, пока браузер ожидает ответа от сервера.Так каков лучший способ справиться с этим?Нужна ли среда, которая может сделать запрос асинхронно?Если да, то какой?(Я бы предпочел, если бы для этого не требовалось слишком много зависимостей и если я смогу продолжать использовать ActiveRecord.)

На самом деле я не слишком много работал с ActionCable или AJAX, но если они могут выполнить работу вв любом случае, я был бы рад узнать, как это сделать.

В идеале я должен иметь возможность отправлять уведомления пользователю в приложении после завершения процесса

view.html.erb:

# Button the user presses to execute the algorithm
<%= link_to 'execute algorithm', algorithm_path(@variable), :method => :put %>

my_controller.rb:

def button_method
  Object.execute_algorithm(@variable)
  redirect_to :back
end

Object.rb:

def self.execute_algorithm(variable)
  # Logic
end

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Я предложу sidekiq в качестве лучшего решения для фоновых задач

0 голосов
/ 23 ноября 2018

Rails использует ActiveJob , которые позволяют ставить в очередь дорогостоящие задачи и запускать их в фоновом режиме.Они довольно просты в использовании.

Кулак, вы можете использовать генератор рельсов для его создания:

rails generate job slow_algorithm

..., который создаст задание в app/jobs/slow_algorithm_job.rb.Там вы можете реализовать свою логику алгоритма.

Поставить в очередь задачу так же просто, просто сделайте это в своем контроллере:

SlowAlgorithmJob.perform_later

Последнее, что вам нужно охватить, это настройка очередейбэкэнд, который на самом деле будет запускать задания.Rails поддерживает пару из них.Вероятно, самый простой для установки это delayed_job , но если вы ищете что-то более масштабируемое, я бы рекомендовал изучить Sidekiq .

РЕДАКТИРОВАТЬ: Как уведомить пользователя о том, что работа выполнена?

Чтобы сделать это, вам необходимо каким-то образом отслеживать ход выполнения задачи.Одним из возможных направлений является создание записи, назовем ее Task, которая представляет один вызов вашего алгоритма.

Когда пользователь запускает действие, которое должно поставить задачу в очередь, запись задачи создается со статусом pending, затем before_perform и after_perform могут быть использованы для перемещения статуса Task в running, а затем в completed.

after_perform можно использовать хук для уведомленияпокупатель.Как приложение собирается это сделать, зависит от вас.Например, Dropbox использует аналогичную систему при загрузке большого количества файлов.Они ставят в очередь задание, архивируют файлы, а затем отправляют электронное письмо со ссылкой для скачивания после завершения задания.

Другой подход - использование системы уведомлений в приложении.

Наконец,чтобы всплывающее уведомление не требовало от пользователя обновления страницы, вам нужно будет использовать ActiveCable и снова отправить уведомление пользователю, используя after_perform hook.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...