apache - framework - nodejs pdf español
¿Qué hace específicamente que Node.js sea más escalable que Apache? (2)
Para ser sincero, aún no lo he entendido del todo, e incluso entiendo cómo funciona Node.js, como un solo hilo que usa el modelo de eventos. Simplemente no entiendo cómo esto es mejor que Apache, y cómo se escala horizontalmente si tiene un solo subproceso.
Depende de como lo uses. Node.js tiene un único subproceso por defecto, pero al usar el (relativamente) nuevo módulo de clúster puede escalar horizontalmente a través de varios subprocesos.
Además, las necesidades de su base de datos también dictarán qué tan efectiva es la escala con el nodo. Por ejemplo, el uso de MySQL con node.js no le brindará casi tanto beneficio como el uso de MongoDB, debido a la naturaleza de MongoDB y node.js.
El siguiente enlace tiene muchos puntos de referencia agradables de sistemas con diferentes configuraciones: http://www.techempower.com/benchmarks/
Node.js no clasifica el más alto, pero en comparación con otras configuraciones que usan nginx (sin apache en sus tablas, pero lo suficientemente cerca) lo hace bastante bien.
Sin embargo, nuevamente depende de tus necesidades. Creo que si solo está sirviendo sitios web estáticos, le recomendamos que se quede con una pila más tradicional. Sin embargo, la gente ha hecho cosas increíbles con node.js para otras necesidades: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ (¿c10k? Ha!)
Editar: Vale la pena mencionar que realmente no estás ''reemplazando'' simplemente apache con node.js. Usted reemplazará apache AND php (en una pila de lámparas típica).
Descubrí que esta publicación de blog de Tomislav Capan lo explica muy bien:
¿Por qué demonios usaría Node.js? Una introducción caso por caso
Mi interpretación de la esencia de esto, para el Nodo 0.10, en comparación con Apache:
Las buenas partes
- Node.js evita el giro de subprocesos para cada solicitud, o no necesita manejar la agrupación de solicitudes a un conjunto de subprocesos como lo hace Apache. Por lo tanto, tiene menos sobrecarga para manejar las solicitudes, y se destaca en responder rápidamente.
- Node.js puede delegar la ejecución de la solicitud en un componente separado y enfocarse en nuevas solicitudes hasta que el componente delegado regrese con el resultado procesado. Este es un código asíncrono, y es posible gracias al modelo de evento. Apache ejecuta las solicitudes en serie dentro de un grupo, y no puede reutilizar el hilo cuando uno de sus módulos simplemente está esperando que se complete una tarea. Apache luego pondrá en cola las solicitudes hasta que un hilo en el grupo vuelva a estar disponible.
- Node.js habla JavaScript y, por lo tanto, es muy rápido al pasar y manipular JSON recuperado de fuentes de API web externas como MongoDB, lo que reduce el tiempo necesario por solicitud. Es posible que los módulos de Apache, como PHP, necesiten más tiempo, ya que no pueden analizar y manipular de forma eficiente JSON porque necesitan una marshalling para procesar los datos.
Las partes malas
Nota: la mayoría de las partes defectuosas enumeradas a continuación se mejorarán con la próxima versión 0.12, algo a tener en cuenta.
- Node.js apesta en tareas computacionales intensivas , porque cada vez que hace algo de larga ejecución, pondrá en cola todas las demás solicitudes entrantes, debido a su único hilo. Por lo general, Apache tendrá más subprocesos disponibles, y el sistema operativo planificará de manera clara y precisa el tiempo de CPU entre estos subprocesos, permitiendo seguir manejando los nuevos subprocesos, aunque un poco más lento. Excepto cuando todos los subprocesos disponibles en Apache manejan las solicitudes, Apache también iniciará las solicitudes de cola.
- Node.js no utiliza completamente las CPU multinúcleo , a menos que haga un clúster Node.js o desarrolle procesos secundarios. Irónicamente, si haces los dos últimos, puedes agregar más sobrecarga de orquestación, el mismo problema que tiene Apache. Lógicamente, también podría activar más procesos Node.js, pero esto no lo gestiona Node.js. Debería probar su código para ver qué funciona mejor; 1) multi-threading desde Node.js con clústeres y procesos secundarios, o 2) múltiples procesos Node.js.
Mitigaciones
Todas las plataformas de servidor tienen un límite superior. Node.js y Apache ambos lo alcanzarán en algún momento.
- Node.js alcanzará el más rápido cuando tengas grandes tareas de cómputo.
- Apache lo alcanzará más rápidamente cuando arroje toneladas de pequeñas solicitudes que requieren una larga ejecución en serie.
Tres cosas que podría hacer para escalar el rendimiento de Node.js
- Utilice CPU multinúcleo , ya sea configurando un cluster , utilizando procesos secundarios o utilizando un orquestador multiproceso como Phusion Passenger .
- Configurar los roles de los trabajadores conectados con una cola de mensajes . Esta será la solución más efectiva contra las solicitudes computacionales intensivas de larga ejecución; descargarlos a una granja de trabajadores. Esto dividirá tus servidores en dos partes; 1) servidores administrativos que se enfrentan al público que aceptan solicitudes de los usuarios, y 2) servidores de trabajadores privados que manejan tareas de ejecución prolongada. Ambos están conectados con una cola de mensajes. Los servidores administrativos agregan mensajes (solicitudes entrantes de larga ejecución) a la cola. Las funciones de trabajador escuchan los mensajes entrantes, los manejan y pueden devolver el resultado a la cola de mensajes. Si se necesita una solicitud / respuesta, el servidor administrativo podría esperar de forma asíncrona para que el mensaje de respuesta llegue a la cola de mensajes. Ejemplos de colas de mensajes son RabbitMQ y ZeroMQ .
- Configura un equilibrador de carga y activa más servidores. Ahora que usa eficientemente el hardware y delega tareas de ejecución prolongada, puede escalar horizontalmente. Si tiene un equilibrador de carga, puede agregar más servidores administrativos. Usando una cola de mensajes, puede agregar más servidores de trabajadores. Incluso podría configurar esto en la nube para que pueda escalar a pedido.