Теоретический:
Обычный подход для этих случаев - асинхронное выполнение задания из процесса обработчика HTTP (поэтому конечный пользователь не слишком долго ожидает ответа отвеб-сервер).
Это означает:
- делегировать тяжелую работу фоновому заданию,
- как-то информировать клиентскую часть о том, когда работа выполнена(2 варианта здесь).
Практический (применение теоретического выше в контексте приложения Rails):
Фоновое задание: сообщество rails предоставляет широкий спектр гемов (+ встроенное решение ActiveJob
) для выполнения асинхронных заданий (= фоновые задачи).Их можно разделить на 2 основные категории:
- сохраняется состояние:
DelayedJob
, Que
и т. Д. (Сохраняет очередь в файловой системе, очередь может быть возобновленаесли сервер перезагружается) - в памяти состояние:
Resque
, Sidekiq
и т. д. (обычно быстрее, но очередь теряется при перезагрузке сервера)
поверхность на стороне клиента: здесь есть два основных варианта:
- опрос : вызов AJAX на стороне клиента на сервер каждый Xсекунд, чтобы проверить, выполнено ли фоновое задание
- подписка через веб-сокет: подключение на стороне клиента через веб-сокет к серверу и прослушивание события, инициированного, когда задание выполнено (например:ActionCable, как указано @Vasilisa)
На основе мнений:
Если вы хотите сохранить простоту,Я хотел бы пойти с очень простой реализацией: Resque
для серверной части и системой опроса для интерфейса.
Если вы хотите что-то законченное, заглушитеВ состоянии сопротивляться перезагрузкам сервера и восстановлению очереди, где она была до сбоя, я бы использовал постоянную версию (например, DelayedJob
) или обернул решение в памяти своей собственной сохраняющейся логикой.