¿Es node.js una buena opción para el procesamiento en segundo plano?


10

Poco a poco estoy aprendiendo node.jsy tengo un pequeño proyecto que quiero comenzar. El proyecto tendrá muchos procesos en segundo plano (descarga de datos de sitios externos, análisis de archivos CSV, etc.).

Una gran "victoria" para mí y para el nodo es el hecho de que usa JavaScript tanto para el cliente como para el servidor. Codifico en Java y JavaScript en mi trabajo diario, pero también soy bastante bueno en Ruby.

Pero, como dije, parece atractivo usar un idioma en todas partes y JS parece encajar en esa factura.

Sin embargo, no tengo mucha experiencia en el uso de JS para ejecutar trabajos en segundo plano. Ruby parece sobresalir en esto. Y no me opongo a usarlo. Entonces, ¿qué piensas sobre ir 100% JS para esto? Me doy cuenta de que proyectos muy grandes requieren soluciones personalizadas. Me pregunto si vale la pena el esfuerzo. ¿O debería seguir con Ruby en ese tipo de tareas?

Opiniones apreciadas.

Gracias


También puede considerar vert.x como una alternativa al nodo.
Mike

Respuestas:


13

Es particularmente fuerte en el manejo de una tonelada de E / S de archivos y esperaría que también maneje una tonelada de comunicación de red. Parece particularmente popular para aplicaciones basadas en socket. Lo importante a tener en cuenta es que si las bibliotecas existentes no satisfacen sus necesidades (hay muchas), es posible que deba sumergirse en algún C que pueda estar vinculado a los comandos JS. También puede generar procesos de Nodo adicionales, pero sospecho que hacer mucho de eso podría generar impuestos (supongo, podría estar equivocado, hay una instancia de V8 generada para cada uno de ellos).

JS es de un solo subproceso y está bloqueando, lo que significa que nada más puede ejecutarse hasta que se complete una llamada a la función. Esta era una característica deseada de JS, esencialmente quitando todas las preocupaciones de enhebrado y cola de sus manos. El JS no impide que las cosas de C / C ++ se ejecuten de una manera más multihilo debajo del capó, por lo que el papel de JS es realmente más arquitectura / mensajero. Si está procesando imágenes, no querrá manejar eso con comandos síncronos de JavaScript porque todo lo demás en su aplicación o servidor se bloqueará hasta que esté listo. La idea es que solicite que se procese una imagen mediante la funcionalidad C / C ++ vinculada, y luego responda al evento 'hecho' cuando la imagen termine de procesarse.

Esto requiere que el JS en cualquier aplicación de Node.js esté fuertemente impulsado por eventos y devoluciones de llamada o probablemente funcionará muy mal. Por lo tanto, no verá muchas llamadas a métodos en Node que no reciben una función para su uso posterior. Una cosa que se vuelve muy clara muy rápido en Node es que te encontrarás en un mundo feo si no encuentras una manera de manejar la pirámide de devolución de llamada. p.ej

//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 );
    } );
} );

Afortunadamente, hay muchas herramientas y ejemplos para manejar esto mejor. La mayoría tiende a girar en torno a mecanismos de promesa y simplemente encadenar una serie de funciones destinadas a responder a los estados de devolución de llamada de los demás en una matriz que hace las cosas de la pirámide fea bajo el capó.

Personalmente, me encanta que tengamos JS en el alto nivel y C / C ++ más cerca del cromo. Es el combo definitivo y me inspiró a comenzar a aprender C. Y no dejes que la falta de potencial bibliotecario te asuste hasta que hayas investigado un poco. Las bibliotecas de nodos se están produciendo a un ritmo muy rápido y están madurando muy rápidamente. Si no está haciendo nada, las probabilidades muy inusuales son buenas, alguien lo tiene cubierto.

La mayor diferencia con Rails es que es probable que JS nunca esté en rails por así decirlo. Tendemos a codificar para poder tenerlo, sin embargo, lo desea muy rápidamente, por lo que existe la cuerda para colgarse con el factor y la arquitectura ha sido bastante DIY en JS hasta años más recientes. Llamo a eso libertad, pero me doy cuenta de que eso no es visto como ideal para muchos desarrolladores.

Además, nunca tendrá un problema de "gema" en Node.js porque intentó instalarlo en algo que no sea una Mac. Los desarrolladores web del lado del cliente desprecian los problemas de dependencia y de ahí proviene una gran parte del núcleo de Node. Si no funciona fuera de la caja en 5 minutos o menos en todas las plataformas populares, generalmente lo arrugamos y lo tiramos. Todavía tengo que encontrarme con un módulo popular que requiera que haga algo especial para que funcione. El sistema de paquetes es excelente.

Pero para responder a su pregunta central de manera más explícita / sucinta: ¿Es bueno con los procesos en segundo plano?

Sí, Node básicamente es un proceso en segundo plano con un medio para conducir una aplicación a través de eventos y devoluciones de llamadas.


1
Aquí hay mucha información general, pero no ha dicho nada sobre la capacidad de node.js para manejar solicitudes de forma asincrónica.
Robert Harvey

Buen punto. Pondré más atención allí.
Erik Reppen

Como ex desarrollador de Rails y desarrollador semi-experimentado de Node.js, definitivamente no estoy de acuerdo con la comparación del sistema de paquetes entre el mundo de Ruby / Rails y el mundo de JS / Node.js que Erik hizo. Cualquier desarrollador de Rails experimentado (o incluso no experimentado) sabe que las "gemas" son, literalmente, como gemas. Trabajan sin esfuerzo. La mayoría de ellos están bien probados, robustos y estables. Sin embargo, más de la mitad de los módulos NPM están mal diseñados, no probados e incluso no completados. Por ejemplo, nadie puede mostrarme los reemplazos JS de Devise o Paperclip con exactamente la misma calidad y riqueza de características. De ninguna manera.
scaryguy

Esa no ha sido mi experiencia en otra cosa que no sea una Mac. Dicho esto, estoy menos impresionado con la compatibilidad entre sistemas operativos de su módulo de nodo típico de lo que solía estar. No estoy seguro de si me he topado con más huevos malos con experiencia o si la comunidad ha crecido para incluir muchos desarrolladores que no toman las plataformas cruzadas tan en serio como deberían. Pero definitivamente hay algo de esnobismo en Linux.
Erik Reppen

Esta respuesta merece tantos votos positivos
Amin Mohamed Ajani

2

Un problema a tener en cuenta es lo que ocurre al procesar archivos grandes en un entorno asíncrono : si su flujo de entrada (un archivo) es más rápido que su flujo de salida (el db), entonces no podrá manejar los eventos de datos de entrada rápidamente suficiente. Esto abrumará alguna parte de su sistema (flujo de salida o memoria) o hará que pierda datos. Por esta razón, el procesamiento de datos de forma asincrónica puede ser un poco complicado. Pero como explica el artículo al que me vinculé, la capacidad de pausar el flujo de entrada hace posible acelerar de una manera que se adapte a su situación.


1

Node.js sobresale en IO. Es muy poco probable que un día descubra que su proceso se atascó, ya que la mayoría de sus hilos se bloquean en las llamadas SQL.

Sin embargo, node.js es realmente malo en el trabajo vinculado al cálculo. Cuando escucho "mucho IO" pienso "¡sí! ¡Ve al nodo!", Pero cuando escucho "análisis", dudo un poco. No estoy seguro de si esto es por alguna razón, además de que las personas no tienen un nodo multiproceso correctamente, pero hasta ahora todo el trabajo de cómputo de mi producto ocurre fuera del nodo.

El subprocesamiento múltiple en node.js es difícil de configurar correctamente. Todo tiene un solo subproceso por defecto y la mayoría del código está escrito bajo el supuesto de que solo se ejecutará bajo un subproceso. Sin duda, necesitará usar dominios para evitar que un error en un hilo derribe toda su aplicación.

También tenga en cuenta que el nodo puede ser un poco más débil en algunas capacidades empresariales. Por ejemplo, sus bibliotecas de registro no se comparan con las de Java. En la actualidad, no existe un buen marco de registro que incluso sea compatible con MDC, lo que en la práctica significa que puede hacer var logPrefix = userId + ": "mucho.

Tampoco he ejecutado un repositorio npm privado, es posible que necesite uno de estos dependiendo de si su código es propietario.


1

Si sus procesos en segundo plano pueden ejecutarse secuencialmente, puede ser bastante bueno. En mi último puesto, tuve que escribir una serie de preprocesadores, exportaciones y utilidades de traducción para muchas fuentes de datos. Usar NodeJS fue muy fácil aquí.

Si no está haciendo un gran procesamiento de cómputo, la simple manipulación de cadenas cortas y el análisis de enteros no es tan malo, si necesita manipular imágenes, probablemente no sea la mejor herramienta (aunque hay módulos y envoltorios invocables eso puede funcionar bien).

Consejo, quédese con los módulos que usan flujos Esto puede facilitar la canalización de su procesamiento a los módulos para ese paso en particular. Si observa cómo se usa event-stream en gulp-jade para la herramienta de compilación gulp , puede ver cuán capaz es.

Para CSV, puede usar node-csv , que es bastante bueno para establecer una base para canalizar registros a una secuencia de procesador.

Para XML de gran tamaño, donde desea hacer un solo registro a la vez, miraría node-halfstreamxml que lee a través de su flujo XML utilizando un procesador SAX y genera eventos para cada nodo. Lo incluiría en una secuencia de lectura / escritura para que pueda aumentar las coincidencias deseadas. Muchos analizadores de objetos xml en el nodo intentarán leer / analizar todo el xml a la vez, y por ejemplo 100mb de xml que se vuelve enorme ... donde el halfstreamxml se leerá como una secuencia.

NOTA: hay otros procesadores como xml-stream que utilizarán expat (biblioteca C) debajo, que pueden proporcionar más rendimiento, pero menos portátiles sin un entorno de compilación.

En general, ha sido una verdadera alegría usar ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.