208 votos

Solicitudes intensivas node.js y CPU

He empezado a juguetear con Node.js servidor HTTP y realmente me gusta escribir server side Javascript, pero algo me mantiene de empezar a usar Node.js para mi aplicación web.

Entiendo el conjunto de e/S asincrónicas concepto, pero estoy un poco preocupado por el borde de los casos donde el código de procedimientos es muy CPU, tales como la manipulación de la imagen o de la clasificación de grandes conjuntos de datos.

Como yo lo entiendo, el servidor va a ser muy rápido para los simples solicitudes de página web, tales como la visualización de una lista de usuarios o ver un post en el blog. Sin embargo, si quiero escribir muy CPU de código (en la administración de back-end, por ejemplo) que genera gráficos o cambia el tamaño de miles de imágenes, la solicitud será muy lento (unos segundos). Puesto que este código no es asincrónico, cada una de las solicitudes que vienen con el servidor durante los pocos segundos se bloquea hasta que mi solicitud lenta que se hace.

Una sugerencia fue utilizar la Web de los Trabajadores de la CPU de las tareas. Sin embargo, me temo que la web de los trabajadores hará que sea difícil escribir código limpio, ya que funciona mediante la inclusión de un separadas archivo JS. ¿Qué pasa si la CPU de código se encuentra en el método de un objeto? Es una especie de chupa para escribir un archivo JS para cada método que es la CPU.

Otra sugerencia fue la de generar un proceso secundario, pero que hace el código es aún menos sostenible.

Sugerencias para superar esta (presunta) obstáculo? ¿Cómo se escribe limpia orientada a objetos con código Node.js asegurándose de que la CPU pesadas tareas son ejecutadas async?

285voto

mbq Puntos 8963

Esto es una equivocación de la definición de servidor web-es sólo debería usarse para "hablar" con los clientes. La pesada carga de las tareas debe ser delegada a los programas independientes (que por supuesto puede ser escrito también en JS).
Usted probablemente iba a decir que es sucio, pero te aseguro que un servidor web a procesar atascado en el cambio de tamaño de imágenes es sólo peor (incluso para digamos Apache, cuando no de bloque de consultas). Aún así, usted puede usar una biblioteca común para evitar el código de redundancia.

EDIT: he venido para arriba con una analogía, la aplicación web debe ser como la de un restaurante. Tiene servicio de meseros (servidor web) y cocineros (los trabajadores). Los camareros están en contacto con los clientes y hacer tareas simples como el suministro de menú o explicar si algún plato vegetariano. Por otro lado delegan las tareas más difíciles a la cocina. Porque los camareros están haciendo sólo cosas simples que responden rápido, y los cocineros se puede concentrar en su trabajo.

Node.js aquí sería una sola, pero muy talentoso camarero que puede procesar muchos pedidos a la vez, y Apache sería una pandilla de tontos de los camareros que acaba de procesar una solicitud por cada uno. Si este Node.js camarero iba a comenzar a cocinar, sería una catástrofe inmediata. Aún así, la cocina también podría escape incluso una gran oferta de Apache camareros, no mencionar el caos en la cocina y la progresiva disminución de responsitivity.

53voto

Tim Puntos 574

Lo que usted necesita es una cola de tareas! Moviendo su larga ejecución de tareas fuera de la web-servidor es una BUENA cosa. Mantener cada tarea en "separados" archivo js promueve la modularidad y la reutilización de código. Te obliga a pensar acerca de cómo estructurar su programa de una manera que hará que sea más fácil de depurar y mantener en el largo plazo. Otro de los beneficios de una cola de tareas es que los trabajadores pueden estar escritos en un idioma diferente. Sólo aparecerá una tarea, hacer el trabajo, y escribir la respuesta.

algo como esto https://github.com/resque/resque

Aquí está un artículo de github acerca de por qué se construyó http://github.com/blog/542-introducing-resque

7voto

Toby Hede Puntos 22128

Par de enfoques que puede utilizar.

Como @Tim notas, usted puede crear una tarea asincrónica que está al margen o en paralelo a su principal servir a la lógica. Depende de sus necesidades exactas, pero incluso cron puede actuar como un mecanismo de la formación de colas.

WebWorkers puede trabajar para su async procesos, pero que no están actualmente soportadas por node.js. Hay un par de extensiones que proporcionan apoyo, por ejemplo: http://github.com/cramforce/node-worker

Usted todavía obtener todavía se puede reutilizar y módulos de código a través de la norma "requiere de un mecanismo de". Usted sólo necesita asegurarse de que la inicial de despacho para el trabajador pasa toda la información necesaria para procesar los resultados.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X