tan seguro que noticias node framework caracteristicas alternativas node.js events akka actor

node.js - seguro - npm



¿En qué se diferencia el sistema Node.js del nuevo modelo de actor de Akka? (3)

He trabajado con Node.js por un tiempo y me considero bastante bueno con Java. Pero acabo de descubrir a Akka y de inmediato me interesé por su patrón de actor (según tengo entendido).

Ahora, suponiendo que mis habilidades de JavaScript estuvieran a la par con mis habilidades de Scala / Java, quiero centrarme en la practicidad de cualquier sistema. Especialmente en términos de servicios web.

Entendí que Node es excelente para manejar muchas operaciones concurrentes. Imagino que un buen servicio web Node para un sistema de administración de activos sería excelente para manejar a muchos usuarios que envían cambios al mismo tiempo (en una aplicación de tráfico grande y pesada).

Pero después de leer sobre los actores en Akka, parece que sería excelente en la misma cosa. Y me gusta la idea de reducir el trabajo a piezas del tamaño de un bocado. Además, hace años incursioné en Erlang y me enamoré del sistema de transmisión de mensajes que usa.

Trabajo en muchas aplicaciones que se ocupan de la lógica empresarial compleja y estoy pensando que es hora de avanzar más en una u otra. Actualizando especialmente las aplicaciones heredadas de Struts y C #.

De todos modos, evitando las guerras santas, ¿cómo son los dos sistemas fundamentalmente diferentes? Parece que ambos están orientados hacia el mismo objetivo. Con tal vez la arquitectura de "autocuración" de Akka tiene una ventaja.

EDITAR

Parece que estoy recibiendo votos cercanos. Por favor, no tome esta pregunta como "¿cuál es mejor, nodo o akka?". Lo que busco son las diferencias fundamentales en bibliotecas impulsadas por eventos como Node y basadas en actores como Akka.


No estoy seguro de que esta sea una comparación justa para dibujar. Leí esto más como "¿cómo se compara un sistema basado en el modelo con un actor?". Nodejs puede apoyar un modelo de actor al igual que Scala en Akka, o C # lo hace en Orleans, de hecho, echa un vistazo a nactor , parece que alguien ya lo está intentando.

En cuanto a cómo se compara un modelo de sistema vs. modelo de actor, dejaría que gente más sabia lo describa. Algunos breves comentarios sobre el modelo Actor:

  • El modelo actor está basado en mensajes
  • Los modelos de actores tienden a funcionar bien con sistemas distribuidos (clusters). Se pueden distribuir sistemas basados ​​en eventos seguros, pero creo que el modelo de actor tiene una distribución integrada con respecto a la distribución de cálculos. Una nueva solicitud se puede enrutar a un nuevo actor en un silo diferente, no estoy seguro de cómo funcionaría en el evento.
  • El modelo Actor admite fallas en que, si el grupo 1 parece estar inactivo, el observador generalmente puede encontrar un silo diferente para hacer el trabajo.

Además, mira el drama . Es la implementación de otro modelo de actor de nodo.


Sin entrar en detalles (sobre los que sé muy poco en el caso de Node.js), la principal diferencia es que Node.js solo admite simultaneidad sin paralelismo, mientras que Akka admite ambos. Ambos sistemas están completamente controlados por eventos y pueden escalar a grandes cargas de trabajo, pero la falta de paralelismo hace que sea difícil en Node.js (es decir, el paralelismo se codifica explícitamente al iniciar varios nodos y despachar las solicitudes en consecuencia; por lo tanto, es inflexible en tiempo de ejecución) , mientras que es bastante fácil en Akka debido a sus ejecutables sintonizables multi-hilo. Dadas pequeñas unidades de trabajo aisladas (invocaciones de actores), Akka paralelizará automáticamente la ejecución por usted.

Otra diferencia de importancia es que Akka incluye un sistema para manejar fallas de una manera estructurada (haciendo que cada actor supervisado por su padre, que es obligatorio) mientras que Node.js confíe en las convenciones para que los autores pasen las condiciones de error desde la devolución de llamada a la devolución de llamada. El problema subyacente es que los sistemas asíncronos no pueden usar el enfoque estándar de las excepciones empleadas por los sistemas síncronos basados ​​en la pila, ya que el código de "llamada" se habrá trasladado a tareas diferentes en el momento en que se produzca el error de devolución de llamada. Tener integrado el manejo de fallas en el sistema hace que sea más probable que las aplicaciones creadas en ese sistema sean robustas.

Lo anterior no pretende ser exhaustivo, estoy seguro de que hay muchas más diferencias.


Todavía no uso Akka, pero parece que es erlang pero en java. En erlang, todos los procesos son como actores en Akka, tienen buzones, puedes enviar mensajes entre ellos, tienes supervisores, etc.

Node.js usa concurrencia cooperativa. Eso significa que tiene concurrencia cuando lo permite (por ejemplo, cuando llama a la operación io o algún evento asincrónico). Cuando tiene una operación larga (calculando algo en bucle largo) bloquea todo el sistema.

Erlang usa el cambio de tarea preventivo. Cuando tiene un bucle largo, el sistema puede pausarlo para ejecutar otra operación y continuar después de un tiempo. Para concurrencia masiva, Node.js es bueno si solo hace operaciones cortas. Ambos soportan millones de clientes: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/

En java necesita hilos para hacer cualquier concurrencia, de lo contrario no puede pausar la ejecución dentro de la función que erlang hace (en realidad erlang pausa entre llamadas a funciones, pero esto se abre con todas las funciones). Puede pausar la ejecución entre mensajes.