En primer lugar los sistemas "más viejos" mensaje (MQ) son mayores en la ejecución, sino que son una nueva en la idea de ingeniería de: colas transaccionales persistentes. Scala Actors y Akka tal vez una implementación más nueva, pero se basan en un modelo de concurrencia más antiguo de Actores.
Sin embargo, los dos modelos terminan siendo muy similares en la práctica porque ambos están basados en mensajes de eventos: Consulte mi respuesta al RabbitMQ vs Akka.
Si va a codificar solo para la JVM, entonces Akka es probablemente una buena opción. De lo contrario, usaría RabbitMQ.
Además, si usted es un desarrollador de Scala, entonces Akka debería ser una obviedad. Sin embargo, las vinculaciones Java de Akka no son muy Java-ish y requieren conversión debido al sistema de tipos de Scala.
También en Java las personas no suelen hacer objetos inmutables que recomiendo que hagas para enviar mensajes. En consecuencia, es muy fácil en Java hacer algo accidentalmente usando Akka que no se escale (usando objetos mutables para mensajes, dependiendo del extraño estado de devolución de llamadas). Con MQ esto no es un problema porque los mensajes siempre se serializan a costa de la velocidad. Con Akka generalmente no lo son.
Akka también escala mejor con una gran cantidad de consumidores que la mayoría de MQ. Esto se debe a que para la mayoría de los clientes de MQ (JMS, AMQP) cada conexión de cola requiere un hilo ... por lo tanto, muchas colas == lotes de hilos que se ejecutan permanentemente. Sin embargo, esto es principalmente un problema del cliente. Creo que ActiveMQ Apollo tiene un despachador no bloqueador que supuestamente soluciona ese problema para AMQP. El cliente RabbitMQ tiene canales que le permiten combinar múltiples consumidores, pero todavía hay problemas con la gran cantidad de consumidores que pueden causar la muerte de interbloqueos o conexiones, por lo que generalmente se agregan más hilos para evitar este problema.
Dicho esto, Akka's remoting es bastante nuevo y probablemente todavía no ofrezca todas las garantías de mensajes confiables y QoS que proporcionan las colas de mensajes tradicionales (pero eso está cambiando todos los días). También es generalmente peer-to-peer pero creo que es compatible con servidor a peer, que generalmente es lo que hacen la mayoría de los sistemas MQ (es decir, punto único de falla) pero hay sistemas MQ que son peer-to-peer (RabbitMQ es server- a la par).
Finalmente, RabbitMQ y Akka hacen un buen par. Puede usar Akka como envoltorio para RabbitMQ, especialmente porque RabbitMQ no lo ayuda a manejar el consumo de mensajes y enrutar los mensajes localmente (en una sola JVM).
Al elegir Akka
- tienen un montón de consumidores (piense millones).
- Necesidad de baja latencia
- abierta al modelo Actor concurrencia
sistema Ejemplo: Un sistema de chat interactivo en tiempo real
Cuándo elegir MQ
- Necesidad de integrarse con muchos sistemas diferentes (es decir, sin JVM)
- fiabilidad del mensaje es más importante que la latencia
- gustaría recibir más herramientas y administrador de interfaz de usuario
- Debido a los puntos anteriores mejores para las tareas de ejecución larga
- le gustaría utilizar un modelo de concurrencia diferente de Actores
sistema Ejemplo: Un sistema de procesamiento por lotes transaccional programado
EDITAR basado en los comentarios en cuestión
Supuse que el OP estaba relacionado con el procesamiento distribuido que tanto Akka como Message Queues pueden manejar. Es decir, asumí que estaba hablando de distributed Akka. El uso de Akka para la concurrencia local es una comparación de manzanas a naranjas para la mayoría de las colas de mensajes. Lo digo más porque puede aplicar el modelo de cola de mensajes localmente como un modelo de concurrencia (es decir, tema, colas, intercambios) que hacen tanto la biblioteca Reactor como simple-react.
Elegir el modelo/biblioteca de concurrencia correcto es muy importante para aplicaciones de baja latencia. Una solución de procesamiento distribuido como una cola de mensajes generalmente no es ideal porque el enrutamiento casi siempre se realiza a través del cable, que obviamente es más lento que dentro de la aplicación y, por lo tanto, Akka sería una elección superior. Sin embargo, creo que algunas tecnologías patentadas de MQ permiten el enrutamiento local. Además, como mencioné anteriormente, la mayoría de los clientes de MQ son bastante estúpidos con el subprocesamiento y no dependen de E/S no bloqueantes y tienen un hilo por conexión/cola/canal ... irónicamente, el no bloqueo no siempre es de baja latencia, pero generalmente es más eficiente.
Como se puede ver el tema de la programación distribuida y programación concurrente es bastante grande y cambiando todos los días por lo que mi intención original no se confunda sino más bien centrarse en un área particular de procesamiento de mensajes distribuido que es lo que a pesar de la OP estaba preocupado con . En términos de concurrencia uno podría querer enfocar sus búsquedas en programación "reactiva" (RFP/streams) que es un modelo "más nuevo" pero similar al modelo de actor y modelo de cola de mensajes de los cuales todos estos modelos se pueden combinar generalmente porque están basados en eventos.
http://stackoverflow.com/questions/4648280/scala-actors-vs-jms/4648843 # 4648843 puede ser útil. – srnm