Чи добре node.js підходить для обробки фону?


10

Я повільно навчаюся node.jsі маю невеликий проект, з якого хочу розпочати. Проект матиме багато фонових процесів (завантаження даних із зовнішніх сайтів, аналіз CSV-файлів тощо).

Великий «виграш» для мене та вузла - це той факт, що він використовує JavaScript як для клієнта, так і для сервера. Я кодую на Java і JavaScript в своїй щоденній роботі, але я також дуже добре в Ruby.

Але, як я вже сказав, здається, привабливе використання однієї мови всюди, і JS, здається, відповідає цьому рахунку.

Однак у мене не було великого досвіду використання JS для запуску фонових завдань. Рубі, здається, в цьому найкраще. І я не проти його використання. Отже, які ваші думки щодо 100% JS для цього? Я усвідомлюю, що дуже великі проекти потребують індивідуальних рішень. Мені просто цікаво, чи варто того докласти зусиль. Або я повинен просто дотримуватися Рубі на такі справи?

Думки високо оцінені.

Дякую


Ви також можете розглянути vert.x як альтернативу вузлу.
Майк

Відповіді:


13

Він особливо сильний в обробці тони вводу / виводу файлів, і я би очікував, що він також добре обробляє мережевий зв’язок. Це здається особливо популярним для програм, керованих сокетами. Важливо пам’ятати, що якщо ваші потреби не задовольняються існуючими бібліотеками (їх багато), вам може знадобитися зануритися в якийсь C, який може бути прив’язаний до JS-команд. Ви також можете породжувати додаткові процеси у вузлах, але я підозрюю, що багато чого може призвести до оподаткування (я припускаю, що це може бути не так - є примірник V8, породжений для кожного з них).

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

Для цього потрібно, щоб JS у будь-якому додатку Node.js був сильно подій та керований зворотним дзвінкам, інакше він, ймовірно, буде працювати дуже погано. Таким чином, ви не побачите багато викликів методів у Node, які не отримують функцію для подальшого використання. Одне, що дуже швидко стає зрозумілим у Node, - це те, що ти хочеш створити світ некрасивого, якщо ти не знайдеш способу впоратися з пірамідою зворотного дзвінка. напр

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

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

Особисто я лякаю любов'ю, що ми наближаємо JS на високому рівні та C / C ++ ближче до хрому. Це найкраща комбінація, і це надихнуло мене почати вчитися на C. І не дозволяйте відсутності бібліотечного потенціалу вас змусити, поки ви не зробите деякі дослідження. Бібліотеки вузлів виробляються дуже швидкими темпами і дозрівають дуже швидко. Якщо ви не робите нічого надзвичайно незвичайного шансу, добре, що хтось це висвітлює.

Найбільша відмінність від Rails полягає в тому, що JS ніколи не буде на рейках, як це було. Ми, як правило, кодуємо можливість мати його, проте ви хочете, щоб це було дуже швидко, тому є мотузка, щоб повісити себе на фактор, і архітектура була досить саморобкою в JS до останніх років. Я називаю цю свободу, але я розумію, що це не сприймається як ідеальне для багатьох чортів.

Крім того, ви ніколи не матимете проблеми з "дорогоцінним каменем" у Node.js, оскільки ви намагалися встановити щось інше, ніж Mac. Клієнтські веб-розробники зневажають проблеми залежності, і саме звідси походить багато ядер Node. Якщо він не виходить з коробки протягом 5 хвилин або менше на кожній популярній платформі, ми, як правило, його збиваємо і кидаємо. Мені ще не доводиться стикатися з популярним модулем, який вимагав зробити щось особливе, щоб він працював. Пакетна система, відмінна.

Але відповісти на своє основне питання більш чітко / коротко: Чи добре це з фоновими процесами?

Так, Node в основному IS фонові процеси із засобом управління додатком через події та зворотні виклики.


1
Тут є багато загальної інформації, але ви нічого не сказали про можливість node.js обробляти запити асинхронно.
Роберт Харві

Гарна думка. Я приділяю там більше уваги.
Ерік Реппен

Як колишній розробник Rails та напівдосвідчений розробник Node.js, я, безумовно, не погоджуюся з порівнянням пакетної системи між світом Ruby / Rails та світом JS / Node.js, зробленим Еріком. Будь-який досвідчений (або навіть не досвідчений) розробник Rails знає, що "дорогоцінні камені" буквально схожі на дорогоцінні камені. Вони працюють без особливих зусиль. Більшість з них добре перевірені, надійні та стабільні. Однак більше половини модулів NPM погано розроблені, не перевірені та навіть не завершені. Наприклад, ніхто не може показати мені заміни JS Devise або Paperclip з точно такою ж якістю та насиченістю функцій. У жодному разі.
scaryguy

Це не було мого досвіду щодо нічого, крім Mac. Отож, мене менше вражає сумісність між ОС для вашого типового модуля вузлів, ніж раніше. Не впевнений, чи я просто зіткнувся з більш поганими яйцями зі стажем, чи спільнота переросла в число людей, які не сприймають крос-платформу так серйозно, як слід. Але там, безумовно, є якийсь Linux снобізм.
Ерік Реппен

Ця відповідь заслуговує на стільки відгуків
Амін Мохамед Аджані

2

Одне з питань, про яке слід пам’ятати, - це те, що виникає при обробці великих файлів в асинхронному середовищі : якщо ваш вхідний потік (файл) швидший, ніж вихідний потік (db), ви не зможете швидко обробляти події вхідних даних. достатньо. Це або перевантажить частину вашої системи (вихідний потік або пам'ять), або призведе до втрати даних. З цієї причини обробка даних асинхронно може бути трохи хитрою. Але як пояснюється стаття, до якої я посилаюся, можливість паузи введення потоку дає змогу дроселювати таким чином, що відповідає вашій ситуації.


1

Node.js досконалий на IO. Ви навряд чи знайдете одного дня, що ваш процес заклинив, оскільки більшість ваших потоків блокуються при викликах SQL.

Однак node.js дуже поганий у роботі, пов'язаній з обчисленнями. Коли я чую "багато IO", я думаю "так! Піди вузол!", Але коли чую "розбір", я трохи вагаюся. Я не впевнений, чи це з якоїсь причини, крім того, що люди не мають багатопотокових вузлів належним чином, але поки вся робота, пов'язана з обчисленнями мого продукту, відбувається поза вузлом.

Налаштування багатопотокових записів у node.js складно налаштувати правильно. За замовчуванням все є єдиною ниткою, і більшість код записується під припущенням, що воно буде працювати лише під одним потоком. Вам, безумовно, потрібно буде використовувати домени, щоб уникнути того, що помилка в одному потоці не знищила всю вашу програму.

Також зауважте, що вузол може бути трохи слабкішим у деяких можливостях підприємства. Наприклад, його бібліотеки журналу не порівнюються з Java. Наразі немає жодної хорошої системи ведення лісозаготівель, яка б навіть підтримувала і MDC, що на практиці означає, що ви повинні зробити дуже var logPrefix = userId + ": "багато.

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


1

Якщо фонові процеси можуть працювати послідовно, це може бути досить добре. На моїй останній посаді мені довелося написати ряд попередніх процесорів, програм експорту та перекладу для багатьох джерел даних. Використання NodeJS тут було вітром.

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

Поради, дотримуйтесь модулів, які використовують потоки. Це може полегшити передачу обробки на модулі для цього конкретного кроку. Якщо ви подивитеся на те, як потік подій використовується в gulp-jade для інструменту збирання gulp, наприклад, ви можете побачити, наскільки він здатний.

Для CSV ви можете використовувати node-csv , що досить добре створює базу для передачі записів до потоку процесора.

Для великих-ish XML, де ви хочете робити один запис одночасно, я би переглянув node-halfstreamxml, який читає ваш XML-потік за допомогою SAX-процесора, і викликає події для кожного вузла. Я б перетворив це на потік читання / запис, щоб ви могли збільшити бажані відповідники. Багато аналізаторів об’єктів xml у вузлі спробують прочитати / проаналізувати весь xml одразу, і, скажімо, 100mb xml, який отримує величезну кількість ... де halfstreamxml буде читати як потік.

ПРИМІТКА. Є інші процесори, такі як xml-stream, які будуть використовувати expat (бібліотеку C) під ними, які можуть давати більшу продуктивність, але менш портативні без середовища побудови.

Взагалі використовувати справжню радість ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.