Si quiero crear una aplicación web escalable en 2017 (un sitio web de redes sociales) y el rendimiento es crítico, ¿debería elegir JavaEE o Spring o Node.js?

Para aprender algo nuevo que es ilimitado e ilimitado como el salvaje oeste, es difícil vencer a Node. Con más de 350k módulos en el repositorio principal, es como un sueño de Apache Commons Logging hecho realidad.

Para un mayor nivel de previsibilidad en el proyecto de desarrollo, Java EE o Spring (o alguna combinación) estaría bien.

La escalabilidad está en el diseño; no en la elección del idioma / marco. Puede escalar fácilmente a millones de usuarios con cualquiera de los enfoques que menciona, siempre y cuando tenga un diseño cuidadoso incorporado. También es notablemente fácil construir un sistema que no escale; Este es el resultado predeterminado si no diseña explícitamente para escalabilidad. En el caso de Node, hace que sea MUY fácil (por ejemplo, una línea de código de bloqueo) detener un servidor completo, y un servidor por usuario puede ser costoso.

Con respecto a la escalabilidad, Node y Java EE / Spring son muy diferentes. El nodo escala asumiendo que todo es asíncrono. Todo. Eso obliga al desarrollador a dividir su trabajo en etapas, donde cada etapa comienza como una devolución de llamada y termina como una llamada a algo que teóricamente podría bloquear, y por lo tanto es una llamada asíncrona, y por lo tanto requiere una devolución de llamada (básicamente, un punto de continuación o punto de finalización) que se le pasará. En otras palabras, todo es una continuación, ¡todo!

Para cualquier persona que trabajó en la programación de Windows 3.x de 16 bits, Node es fácil, porque las mismas cosas que tenía que hacer en Windows, debe hacerlo en Node: multitarea cooperativa. La diferencia es que era terriblemente complicado hacerlo en Windows, pero JavaScript como lenguaje hace que sea notablemente simple hacerlo en Node (porque todo es una función en JavaScript). ¡También significa que puede ser notablemente desordenado!

Personalmente no me gusta JavaScript (el lenguaje), pero no me gusta con más respeto y admiración que la mayoría de las cosas que no me gustan. El motor Google V8 (lo que realmente hace el arduo trabajo de ejecutar Node, que es comparable al Hotspot JVM en muchos aspectos) es una pieza brillante de ingeniería, que ha generado un aumento de rendimiento de dos órdenes de magnitud en comparación los motores de Internet Explorer / Mozilla Firefox del día.

No creo que deba preocuparse por la escalabilidad en este momento. Voy a hacerte una pregunta rápida, ¿cuál de estos idiomas conoces bien ahora? ¿En qué le gustaría invertir más tiempo? Si su respuesta no es ninguna de las anteriores. Luego lee mis siguientes puntos.

Debe aprender los conceptos básicos de JavaScript. Para un sitio de redes sociales, si es un principiante, ¿por qué no intenta usar Ruby on Rails? Al menos con esto, no necesita JavaScript para poner en funcionamiento una aplicación Rails. Bueno, definitivamente necesitará JavaScript más tarde, pero puede preguntar por qué Rails. Esto se debe a que Rails existe desde hace bastante tiempo, la comunidad es grande, esto significa que siempre obtendrá una solución rápida para cualquier problema con el que se encuentre.

Una vez que tenga un prototipo en funcionamiento en Rails, ya habrá dominado la arquitectura de la base de datos de su aplicación, ahora puede diferenciar lo que es un modelo, un controlador y una vista. Ahora, lo que querrá hacer después es encontrar una manera de integrar gemas como los raíles de reacción para introducir un front-end receptivo y fácil de usar.

Entonces ahora puede integrarlo con un front-end de JavaScript, es su elección elegir a quien quiera, Vue, Angular 2 y React son una de las mejores opciones en estos días. Si toma la idea de lo que ya debe haber aprendido en Rails de vuelta al Nodo JS, entonces estará en la construcción de aplicaciones súper escalables en cualquier idioma de su elección.

La escalabilidad es lo último en su ciclo de vida de desarrollo de aplicaciones, no lo primero. No necesita preocuparse por eso incluso antes de comenzar. La escalabilidad es solo una palabra lanzada principalmente en estos días por personas que no saben lo que quieren hacer. No te confundas

Para esta respuesta, voy a elegir entre Spring MVC como representante de Java y elegir express para Node.js

Entonces, hagamos una pequeña comparación:

SERIALIZACIÓN JSON:

Express supera a la mierda de Spring MVC en 186,548 vs 22,013 respuestas por segundo.

Entonces, para esta ronda, ¡gana Node.js!

CONSULTA DE SEÑAL:

Esta prueba se realiza consultando una sola fila de la base de datos.

Express usando Mongodb: 48,392 respuestas de la base de datos por segundo

Express usando Mysql: 45,550 respuestas de la base de datos por segundo

Primavera: 16.022 respuestas de la base de datos por segundo

Node.js gana

MÚLTIPLES CONSULTAS:

Esta prueba se realiza midiendo las respuestas por segundo a 20 consultas por solicitud.

Expresar usando Mongodb: 3.840 respuestas de la base de datos por segundo

Express usando Mysql: 3,772 respuestas de la base de datos por segundo

Primavera: 2,363 respuestas de la base de datos por segundo

Node.js gana

ACTUALIZACIÓN DE DATOS :

Esta prueba ejercita la base de datos escribe. Cada solicitud se procesa recuperando varias filas de una tabla de base de datos simple, convirtiendo las filas en objetos en memoria, modificando un atributo de cada objeto en la memoria, actualizando cada fila asociada en la base de datos individualmente y luego serializando la lista de objetos como un Respuesta JSON.

Express usando Mongodb: 2,841 respuestas por segundo a 20 actualizaciones por solicitud

Express usando Mysql: 374 respuestas por segundo a 20 actualizaciones por solicitud

Primavera: 833 respuestas por segundo a 20 actualizaciones por solicitud

Node.js gana de nuevo.

TEXTO SIN FORMATO:

En esta prueba, el marco responde con la respuesta más simple: un mensaje de “Hola, Mundo” presentado como texto sin formato.

Expreso: 213,982 respuestas por segundo

Primavera: 131.533 respuestas por segundo.

En conclusión , Node.js tiene un mejor rendimiento que Java EE.

referencias: techempower ronda 13 aquí

Ambos escalarán muy bien, pero en 2017 puede usar Javascript ES6 de forma nativa con Node.js y esto podría proporcionar una gran ventaja sobre Java, porque terminará desarrollando la aplicación más rápido usando Node.

Si desea una respuesta más práctica, he ejecutado un punto de referencia de la vida real entre múltiples tecnologías, incluyendo Express JS con Node JS 8.2 y Spring con Java.

Construí una API REST con 4 puntos finales, cada uno con una complejidad diferente:

  1. Hola mundo simplemente responda con un JSON que contiene la cadena Hello World .
  2. Computación Calcule los primeros 10.000 números de Fibonacci.
  3. Listado simple Tenemos una base de datos MySQL que contiene una tabla de países y enumeraremos todos los países.
  4. Listado complejo agregamos una tabla de usuarios junto con un mapeo de muchos a muchos entre usuarios y países y queremos enumerar todos los usuarios que visitaron Francia, junto con todos los países que visitó cada uno.

Usando una máquina de 4 núcleos y 8 GB de RAM de DigitalOcean, el número de solicitudes por segundo fue el siguiente:

  1. Hola Mundo:
    Express JS – 21.972
    Primavera – 21.853
  2. Cálculo:
    Express JS – 17.278
    Primavera – 19.871
  3. Listado simple:
    Express JS – 2.904
    Primavera – 2.816
  4. Listado complejo:
    Express JS – 514
    Primavera – 562

Los he probado en 3 configuraciones de servidor. En este servidor de tamaño medio tuvieron un rendimiento bastante cercano, pero en el más grande, 12 núcleos, 32 GB de RAM, Node.js se mejoró con PM2 .

También probé más tecnologías, puedes consultar el punto de referencia completo aquí:
Web REST API Benchmark en una aplicación de la vida real

Definir “rendimiento” y “escala bien”.

No así no. En detalle, en términos objetivos, ya que pertenecen a su proyecto.

¿Es esta realmente la preocupación más importante que deberías tener en este momento?