Чтобы ответить на 3 вопроса:
- маршрут в Rails, принять запрос, запланировать задание и отправить sh его в очередь Redis
Да, безусловно, можно добавить sh атрибуты нового задания в очередь redis. Вы просто строите свои аргументы (вероятно, сериализуете их как JSON) и помещаете pu sh в очередь с Redis 'rpush
(для этого можно использовать гем Redis Ruby).
обработать задание работника, написанного на узле / Javascript
Да, в Redis нет ничего, что говорит о том, что писатель должен быть написан на том же языке, что и читатель - если приложение Rails сериализует ввод в JSON, приложение Node может выдать это JSON и обработать его
Пусть Rails прослушает очередь и отправит результат в браузер после завершения
Это более сложная часть. Главное, что нужно понять, это то, что запрос является синхронным процессом, но вся система фоновых заданий asyn c - гипотетически вы можете просто указать контроллеру sleep
и проверить для подтверждения на al oop, но это неэффективно по двум причинам - во-первых, нет необходимости запрашивать redis для подтверждения на al oop (так как Redis имеет функцию «подписки»), а во-вторых, вы собираетесь иметь немного впустую памяти, если вы делаете свои контроллеры sleep
.
Лучшим способом сделать это было бы использование веб-сокетов. Чтобы запланировать задание, вы можете использовать обычный контроллер или обработчик входящего сообщения веб-сокета - в любом случае он запланирует задание и сразу же ответит «задание поставлено в очередь». Затем отдельно в приложении Rails (вне методов контроллера) вы можете настроить подписку Redis на очередь «работа выполнена». Получив сообщение, он найдет соединение через веб-сокет с соответствующим клиентом и отправит исходящее сообщение о том, что задание было обработано.