Подходит ли node.js для фоновой обработки?

10

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

Большой «выигрыш» для меня и для узла заключается в том, что он использует JavaScript как для клиента, так и для сервера. Я пишу на Java и JavaScript в своей повседневной работе, но также хорошо разбираюсь в Ruby.

Но, как я уже сказал, кажется привлекательным использовать повсеместно один язык, и JS, кажется, подходит под этот счет.

Однако у меня не было большого опыта использования JS для выполнения фоновых заданий. Руби, кажется, преуспевает в этом. И я не против его использования. Так что вы думаете о том, чтобы сделать 100% JS для этого? Я понимаю, что очень большие проекты требуют индивидуальных решений. Мне просто интересно, стоит ли это усилий. Или я должен просто придерживаться Руби на таких делах?

Мнения приветствуются.

Спасибо

cbmeeks
источник
Вы также можете посмотреть на vert.x как альтернативу узлу.
Майк

Ответы:

13

Он особенно силен в обработке тонны файлового ввода-вывода, и я ожидаю, что он также хорошо справится и с тонной сетевой коммуникации. Это кажется особенно популярным для приложений, управляемых сокетами. Важно помнить, что если ваши потребности не удовлетворяются существующими библиотеками (их много), вам может потребоваться погрузиться в некоторый C, который может быть связан с командами JS. Вы также можете порождать дополнительные процессы Node, но я подозреваю, что выполнение многих из них может обернуться налогом (я предполагаю - может быть неправильно - для каждого из них создается экземпляр V8).

JS является однопоточным и блокирующим, что означает, что больше ничего не может быть выполнено, пока не завершится вызов функции. Это была желанная особенность JS, по сути, убирающая все проблемы с потоками и очередями из ваших рук. JS не останавливает работу C / C ++ от более многопоточной работы под капотом, поэтому роль JS - скорее архитектура / мессенджер. Если вы обрабатываете изображения, вы не захотите обрабатывать их синхронными командами JavaScript, потому что все остальное в вашем приложении или сервере будет заблокировано, пока это не будет сделано. Идея состоит в том, что вы вызываете обработку изображения с помощью связанной функциональности C / C ++, а затем отвечаете на событие «done», когда изображение завершает обработку.

Для этого требуется, чтобы 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 была довольно самостоятельной в JS до недавних лет. Я называю это свободой, но я понимаю, что это не считается идеальным для многих разработчиков.

Кроме того, у вас никогда не возникнет проблема «драгоценного камня» в Node.js, потому что вы пытались установить что-то другое, кроме Mac. Веб-разработчики на стороне клиента презирают проблемы с зависимостями, и именно отсюда исходит ядро ​​Node. Если это не работает из коробки через 5 минут или меньше на каждой популярной платформе, мы обычно скомкаем это и бросим это. Я еще не столкнулся с популярным модулем, который требовал, чтобы я сделал что-то особенное, чтобы он работал Система упаковки, отлично.

Но чтобы ответить на ваш основной вопрос более четко / лаконично: хорошо ли это с фоновыми процессами?

Да, Node - это в основном фоновые процессы с возможностью управления приложением через события и обратные вызовы.

Эрик Реппен
источник
1
Здесь много общей информации, но вы ничего не сказали о способности node.js обрабатывать запросы асинхронно.
Роберт Харви
Хорошая точка зрения. Я буду уделять больше внимания там.
Эрик Реппен
Как бывший разработчик Rails и полуопытный разработчик Node.js, я определенно не согласен со сравнением системы пакетов между миром Ruby / Rails и миром JS / Node.js, который сделал Эрик. Любой опытный (или даже неопытный) разработчик Rails знает, что «драгоценные камни» буквально похожи на драгоценные камни. Они работают без усилий. Большинство из них хорошо проверены, надежны и стабильны. Однако более половины модулей NPM плохо спроектированы, не протестированы и даже не выполнены. Например, никто не может показать мне замены JS Devise или Paperclip с точно таким же качеством и богатством функций. Ни за что.
страшно
Это был не мой опыт ни с чем, кроме Mac. Тем не менее, я менее впечатлен кросс-ОС совместимостью вашего типичного модуля узла, чем раньше. Не уверен, что я только что столкнулся с большим количеством плохих яиц с опытом или в сообществе появилось много разработчиков, которые не воспринимают кроссплатформенность так серьезно, как следовало бы. Но там определенно есть некоторый снобизм Linux.
Эрик Реппен
Этот ответ заслуживает такого большого количества голосов
Амин Мохамед Аджани
2

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


источник
1

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

Однако node.js действительно плох в работе, связанной с вычислениями. Когда я слышу «много IO», я думаю: «Да! Иди!», Но когда я слышу «парсинг», я немного сомневаюсь. Я не уверен, если это по какой-то причине, кроме людей, не являющихся должным образом многопоточным узлом, но пока вся работа моего продукта, связанная с вычислениями, происходит за пределами узла.

Многопоточность в node.js сложно настроить правильно. По умолчанию все является однопоточным, и большая часть кода написана в предположении, что он будет работать только в одном потоке. Вам, безусловно, нужно будет использовать домены, чтобы не допустить, чтобы ошибка в одном потоке привела к сбою всего приложения.

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

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

djechlin
источник
1

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

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

Совет, придерживайтесь модулей, которые используют потоки. Это может упростить передачу вашей обработки в модули для этого конкретного шага. Если вы посмотрите, как, например, поток событий используется в gulp-jade для инструмента сборки gulp , вы увидите, насколько он способен.

Для CSV вы можете использовать node-csv , который довольно хорош при создании базы для передачи записей в поток процессора.

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

ПРИМЕЧАНИЕ: есть другие процессоры, такие как xml-stream, которые будут использовать ниже expat (библиотека C), которые могут повысить производительность, но менее переносимы без среды сборки.

В общем, это была настоящая радость ...

Tracker1
источник