Подтвердить что ты не робот

Фоновые процессы в Node.js

Каков хороший подход к обработке фоновых процессов в приложении NodeJS?

Сценарий: после того, как пользователь отправляет что-то в приложение, я хочу хрустить данные, запрашивать дополнительные данные из внешних ресурсов и т.д. Все это занимает много времени, поэтому я хочу, чтобы это было из цикл req/res. Идеально было бы просто иметь очередь заданий, где вы можете быстро сбросить задание, а демон или бегун заданий всегда будут принимать самые старые и обрабатывать его.

В RoR я бы сделал это с чем-то вроде Delayed Job. Что такое Node эквивалент этого API?

4b9b3361

Ответ 1

Если вы хотите что-то легкое, которое работает в том же процессе, что и сервер, я настоятельно рекомендую Bull. Он имеет простой API, который позволяет осуществлять мелкий контроль над очередями.

Если вы ищете что-то, что работает как отдельный рабочий процесс, возможно, посмотрите Kue. Он может работать как сервер RESTful API, и даже для него есть несколько интерфейсных приложений.

Если вы знакомы с Ruby Resque, существует реализация node под названием Node-resque

Bull, Kue и Node -resque поддерживаются Redis, что является вездесущим среди рабочих очередей Node.js. Все 3 могли бы делать то, что делает RoR DelayedJob, это зависит от конкретных функций, которые вы хотите, и от ваших настроек API.

Ответ 2

Фоновые задания напрямую не связаны с работой веб-службы, поэтому они не должны находиться в одном процессе. По мере увеличения масштаба использование памяти фоновых заданий будет влиять на производительность веб-службы. Но вы можете поместить их в один и тот же репозиторий кода, если хотите, что имеет смысл.

Одним из хороших вариантов обмена сообщениями между этими двумя процессами будет redis, если отбросить сообщение каждый раз и сейчас. Если вы хотите, чтобы "сообщение не осталось", вам понадобится более тяжелый брокер, например Rabbit. Процесс веб-сервиса может публиковаться, и ваш фоновый процесс работы может подписаться.

Для двух процессов не требуется совместное размещение, они могут быть на отдельных виртуальных машинах, контейнерах Docker, независимо от того, что вы используете. Это позволяет значительно уменьшить масштаб.

Ответ 3

Если вы используете MongoDB, я рекомендую Agenda. Таким образом, отдельные экземпляры Redis не запускаются, и все функции, такие как планирование, очередность и веб-интерфейс, присутствуют. Пользовательский интерфейс Agenda является необязательным и может выполняться отдельно, конечно.

Также рекомендовал бы установить слабо связанную абстракцию между вашей логикой приложения и системой очередности/планирования, чтобы при необходимости можно было поменять всю систему фоновой обработки. Другими словами, храните столько логики приложений и обработки от своих определений заданий в Повестке дня, чтобы они были легкими.

Ответ 4

Я хотел бы предложить использовать Redis для планирования заданий. В нем много разных структур данных, вы всегда можете выбрать тот, который лучше подходит для вашего использования.

Вы упомянули RoR и DJ, поэтому я предполагаю, что вы знакомы с sidekiq. Вы можете использовать node-sidekiq для планирования заданий, если хотите, но его субоптимальное imo, поскольку основной целью является объединение nodejs с RoR.

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

Ответ 5

Я предлагаю использовать правильную фреймворк Node.js для создания вашего приложения.

Я думаю, что самый мощный и простой в использовании Sails.js.

Это структура MVC, поэтому, если вы привыкли развиваться в ROR, вам будет очень легко!

Если вы его используете, он уже представляет собой мощный (в javascript условиях) менеджер заданий.

new sails.cronJobs('0 01 01 * * 0', function () {
   sails.log.warn("START ListJob");
}, null, true, "Europe/Dublin");

Если вам нужна дополнительная информация, не стесняйтесь обращаться ко мне!