2015-06-23 1 views
48

Что хорошего aproach для обработки фоновых процессов в приложении NodeJS?Фоновые процессы в Node.js

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

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

+3

Вопрос - это рекомендация по программному обеспечению, так как она сформулирована сейчас, что в конечном итоге закрывается. Если бы вы заменили последнее предложение на «Что такое эквивалент NodeJS этого API?» он становится больше по теме. Я бы хотел, чтобы это ответ скорее, чем закрыто, так как мне нужно сделать что-то подобное. – ssube

+0

Спасибо, перефразировали. –

+2

Хорошие рекомендации ниже. Также может быть полезен API 'ChildProcess'. https://nodejs.org/api/child_process.html – lispHK01

ответ

67

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

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

Если вы знакомы с Resque Руби, есть реализация узел называется Node-resque

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

+1

Это очень хороший ответ, но упоминание о модуле ChildProcess API и [webworker-threads] (https://www.npmjs.com/package/webworker-threads) может сделать это здорово. ;) – ssube

+0

@ssube Я не согласен с вами. Если вы не имеете в виду создание вилки, которая смотрит на очередь, чтобы выполнить некоторую команду, вы правы. +1 от меня. Child_process - это то, что я использую, и моя проблема в том, что я мог бы открыть огромный набор процессов, но если бы у меня был способ управлять задачами, которые будут выполняться в очереди, то я был бы счастлив, что CP является хорошим решением. Это можно сделать, но дело в том, чтобы не выполнять всю работу самостоятельно, а повторно использовать код, который тестируется на битву (в этом случае что-то вроде Kue, которое делает всю магию, в которой вы нуждаетесь, и допускаете интеграцию api). – dewwwald

17

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

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

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

+0

Действительно единственный ответ, который упомянул Кролика? Это корпоративный ответ. +1 –

-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"); 

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

+3

Я ищу менеджер фонового процесса для узла. По определению это должно быть отдельно от вашего веб-приложения. И не имеет значения, используете ли вы Sails, Express, Hapi или что хотите. –

+0

Хорошо, вы можете попробовать Bull или Web Worker-Threads ... удачи с Node.js :) –

+0

Похоже, sails.js довольно большой и делает гораздо больше, чем cronJobs. Я нашел node-cron (https://github.com/kelektiv/node-cron), который, я уверен, использует sails.js. – pbatey

7

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

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

1

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

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

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

Смежные вопросы