Rails рабочий написан в Javascript? - PullRequest
0 голосов
/ 16 апреля 2020

У нас есть приложение Node, и часть кода Node выполняется как фоновое задание. В работе используется BullMQ , который написан на JavaScript и использует Redis под капотом.

Мы находимся в процессе переноса некоторого приложения Node на Rails. Но я бы хотел сохранить фоновое задание, написанное в Node, как есть.

Возможно ли иметь:

  1. Маршрут в Rails, принять запрос, расписание работа и пу sh это в очередь Redis?
  2. Обрабатывается ли задание работником, написанным в Node / JavaScript?
  3. Есть ли в Rails прослушивание очереди (веб-сокеты или длинный опрос) и отправка результата в браузер после завершения?

Другими словами, существует ли независимая от языка система Redis / Queue?





                                                       +-------------+
                                                       |             |
                                                       |             |
                                                       | REDIS QUEUE |
                                      +----------------+             |
                                      |                |             |
                                      |                |             +^--+
                                      |                +---------------+ |
     +---------+                      |                       ^        | |
     |         |              +-------v--+                    |        | |
     | browser +--------------+          +--------------------+        | |
     |         <--------------+  Rails   |                             | |
     +---------+              |          |                             | |
                              +----------+                   +---------v----+
                                                             |              |
                                                             |              |
                                                             |  NODE worker |
                                                             |              |
                                                             |              |
                                                             +--------------+




Я больше знаком с заданиями / очередями в Node, чем в Rails. Я видел много вариантов, таких как SideKick и Resque, но кажется, что рабочие в основном написаны на Ruby.

1 Ответ

3 голосов
/ 16 апреля 2020

Чтобы ответить на 3 вопроса:

  1. маршрут в 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 на очередь «работа выполнена». Получив сообщение, он найдет соединение через веб-сокет с соответствующим клиентом и отправит исходящее сообщение о том, что задание было обработано.

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