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


96

Який хороший підхід для обробки фонових процесів у додатку NodeJS?

Сценарій : Після того, як користувач публікує щось у програмі, я хочу розчавити дані, вимагати додаткових даних із зовнішніх ресурсів тощо. Все це забирає багато часу, тому я хочу вийти з циклу req / res. Ідеально було б просто мати чергу завдань, на якій можна швидко скинути роботу, а демон або виконавець завдань завжди візьме найстаріший і обробить його.

У RoR я би зробив це з чимось на кшталт затримки роботи. Що таке Вузовий еквівалент цього API?


4
Питання - це рекомендація щодо програмного забезпечення, як це формулюється зараз, і це врешті-решт закриється. Якщо ви замінили останнє речення на "Який еквівалент NodeJS цього API?" він стає більш тематичним. Я хотів би, щоб на це відповідали, а не закривались, оскільки мені потрібно зробити щось подібне.
ssube

Спасибі, перефразовуючи це.
Оле Спаарман

2
Хороші пропозиції нижче. Також є ChildProcessAPI, який може бути корисним. nodejs.org/api/child_process.html
lispHK01

stackoverflow.com/users/69349/ole-spaarmann - Мені було б цікаво дізнатися, що ви нарешті вибрали, і чи зможете ви надати дуже простий приклад того, як ви інтегрували своє рішення з NodeJS - дякую!
MLissCetrus

@MLissCetrus Я вирішив вивчати Еліксир і більше не використовувати NodeJS :)
Ole Spaarmann

Відповіді:


114

Якщо ви хочете щось легке, яке працює в тому ж процесі, що і сервер, я дуже рекомендую Bull . Він має простий API, який дозволяє чітко контролювати свої черги.

Якщо ви шукаєте щось, що працює як окремий робочий процес, можливо, загляньте в Kue . Він може працювати як сервер RESTful API і навіть має декілька прикладних додатків, написаних для нього.

Якщо ви знайомі з Resque Ruby, існує реалізація вузла під назвою Node-resque

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


3
Це дуже хороша відповідь, але згадка про API ChildProcess та модуль веб-робочих ниток може зробити його чудовим. ;)
ssube

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

Чи працює Bull з кластеризацією PM2? Або вам потрібно створити власні кластери вручну, як показано в їхній документації?
Шаян Нахварр

31

Фонові завдання безпосередньо не пов’язані з роботою вашого веб-сервісу, тому вони не повинні бути в одному процесі. У міру збільшення масштабів використання пам'яті фонових завдань вплине на продуктивність веб-сервісу. Але ви можете помістити їх у одне сховище коду, якщо хочете, що б не мало сенсу.

Хорошим вибором для обміну повідомленнями між цими двома процесами було б повторне перенесення , якщо раз у раз випадає повідомлення. Якщо ви хочете, щоб "жодне повідомлення не залишилося", вам знадобиться брокер більш важкої ваги, як Кролик . Ваш процес веб-сервісу може публікувати, а ваш фоновий процес роботи може підписатися.

Не потрібно, щоб обидва процеси розміщувались спільно, вони можуть знаходитись на окремих VM, Docker-контейнерах, якими б ви не користувалися. Це дозволяє масштабувати без особливих проблем.


3
Дійсно єдина відповідь, на яку згадується Кролик? Це відповідь підприємства. +1
Огі Гарднер

11

Якщо ви використовуєте MongoDB, я рекомендую Порядок денний . Таким чином, окремі екземпляри Redis не працюють, і такі функції, як планування, черга в черзі та веб-інтерфейс, присутні. Інтерфейс програми не є обов’язковим, і його можна запускати окремо, звичайно.

Також рекомендуємо налаштувати слабко пов'язану абстракцію між логікою програми та системою чергування / планування, щоб вся система фонової обробки може бути замінена за потреби. Іншими словами, тримайте якомога більше логіки застосування / обробки подалі від своїх завдань порядку денного, щоб вони були легкими.


3

Я хотів би запропонувати використовувати Redis для планування завдань. У ньому багато різних структур даних, ви завжди можете вибрати ту, яка краще підходить для вашого використання.

Ви згадали про RoR та DJ, тож я припускаю, що ви знайомі з sidekiq. Якщо ви хочете, ви можете використовувати node-sidekiq для планування завдань, але його неоптимальний imo, оскільки його основна мета полягає в інтеграції nodejs з RoR.

Для демонстрації робітниками я рекомендую використовувати PM2 . Він широко використовується і активно підтримується. Він вирішує багато проблем (наприклад, розгортання, моніторинг, кластеризація), тому переконайтеся, що це не буде зайвим для вас.


1

Я спробував бджолину чергу і бик, і врешті вибрав бика. Я вперше вибрав бджолину чергу, коли це досить просто, їх приклади легко зрозуміти, тоді як приклади бика трохи складні. бджолина вікі Походження бджолиної черги також перегукується зі мною. Але проблема з бджолами - це <1> час їх вирішення досить повільний, останнє оновлення було 10 місяців тому. <2> Я не можу знайти простий спосіб призупинити / скасувати роботу.

З іншого боку, Bull часто оновлює свої коди, реагуючи на проблеми. Оцінка черги завдань Node.js сказала, що слабкість бика - це "повільний час вирішення питань", але мій досвід навпаки!

Але в будь-якому випадку їх апі подібний, тому переходити з одного на інший досить просто.


-6

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

Я думаю, що найпотужніший і простий у використанні - Sails.js .

Це рамка MVC, тому якщо ви звикли розвиватися в ROR, вам це буде дуже просто!

Якщо ви його використовуєте, він вже є потужним менеджером завдань (в JavaScript).

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

Якщо вам потрібна додаткова інформація, не соромтеся зв’язатися зі мною!


5
Я шукаю менеджера фонових процесів для Node. За визначенням, це має бути відокремленим від вашого веб-додатку. І це не має значення, чи використовуєте Ви вітрила, експрес, хапі чи що завгодно.
Оле Спаарман

Гаразд, ви можете спробувати Bull або Webworker-Threads ... удачі з Node.js :)
Zio Mak Sò

Схоже, sails.js досить великий і робить набагато більше, ніж cronJobs. Я знайшов node-cron ( github.com/kelektiv/node-cron ), на який я думаю, що те, що використовує sails.js.
pbatey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.