¿Por qué debería elegir un lenguaje asincrónico como Node.js para el backend?

Muchas, muchas de las cosas que hace un servidor moderno implican tareas de bajo cómputo que deben esperar en E / S. El uso de un modelo asíncrono es más rápido y requiere menos recursos para manejar ese tipo de transacción.

Entré en mayor detalle en otra respuesta, [1] pero con async puedes manejar más transacciones por segundo, usando menos memoria, en el mismo hardware. A veces, hasta 100 veces más rendimiento en el mismo servidor. Si puede ejecutar tres servidores en lugar de 300, eso puede ahorrarle miles de dólares por mes.

Una empresa con la que trabajé utilizó servidores de escalado automático para manejar una carga que hubiera sido manejada cómodamente por un solo servidor, y sus costos excedieron los $ 10k / mes. Después de implementar mis sugerencias (que incluían un servidor asíncrono) sus costos fueron menos de una décima parte. Eso es suficiente para contratar a un ingeniero adicional. En los EE.UU.

Yo diría que async debería considerarse una mejor práctica para la lógica del servidor. Si tiene algo de cómputo intensivo, entonces su servidor asíncrono debe llenar una cola de trabajos con solicitudes y luego esperar los resultados directamente (porque en asíncrono, esperar un resultado de E / S es casi cero) o devolver un enlace de inmediato o token donde se guardarán los resultados.

Async es especialmente ventajoso si necesita una conexión a tiempo real a largo plazo con su cliente. Aún debe evitar las tareas intensivas de CPU, pero para eso están las colas de mensajes.

Notas al pie

[1] La respuesta de Tim Mensch a ¿Es cierto que el Nodo JS ayuda a reducir los costos del servidor en comparación con los servidores PHP y Java?

Tampoco porque

  • Eres un desarrollador front end puro y quieres escribir el back end. Usar nodo significa que escribe en el mismo idioma que el front end. Su back-end ahora usa exactamente las mismas estructuras asíncronas que el manejo de eventos de UI que ya comprende.
  • Usted es un desarrollador de back-end y sus requisitos significan que manejará muchas llamadas individuales de bajo rendimiento o llamadas donde la única penalidad de rendimiento real es el acceso a la base de datos. El nodo sobresale en este tipo de conjunto de requisitos (y son requisitos comunes hasta que realmente necesite comenzar a escalar).

Para lo que nunca usaría el nodo es para las llamadas que son muy pesadas. La naturaleza de nodo único significa que es particularmente inadecuado como servidor de cómputo.

Según el comentario: “Puedo entender la lógica de programación asincrónica de Javascript para los navegadores. Pero, ¿por qué querría usar una lógica asincrónica en el lado del servidor?

Los servidores deben poder responder a múltiples solicitudes simultáneas de usuarios. Dado que el proceso Node es de un solo subproceso, se basa en entregar el trabajo a subprocesos de E / S asincrónicos / sin bloqueo para permitir la concurrencia. Esto, en combinación con un bucle de eventos, es cómo funciona Node.

JavaScript en sí no es un “lenguaje asincrónico”. Esa es una declaración bastante sin sentido. Lo que importa aquí es la arquitectura de Node para soportar la asincronía.

Si ha prestado atención aquí, notaremos que esta arquitectura no es buena para cualquier carga concurrente que requiera una gran cantidad de cómputo en la CPU que ejecuta las solicitudes.

El modelo de concurrencia de Node.js hace que sea extremadamente fácil paralelizar trabajos y trabajar en conjunto. En esencia, esto significa que el modelo de concurrencia de Node.js (que es el mismo que el modelo de concurrencia de JavaScript) hace que la concurrencia sea muy simple. Es por eso que Node.js es bastante popular para crear muchos tipos de servidores HTTP / TCP. En última instancia, Node.js utiliza un conjunto de subprocesos para hacer solicitudes de E / S en paralelo, pero el conjunto de subprocesos está oculto para el desarrollador. El desarrollador escribe todo su código en un solo hilo. Debido a esto, realmente no tiene que preocuparse por las cerraduras y se evitan clases enteras de condiciones de carrera. En comparación con Java, Node.js es un paseo por el parque. Seriamente. Mucho más fácil de usar.

Rendimiento, capacidad de usar el mismo lenguaje (javascript) en el front-end y acceso al ecosistema más popular (npm).