Estaba probando mis manos en Akka (API de Java). Lo que intenté fue comparar el modelo de concurrencia basado en actores de Akka con el modelo de concurrencia simple de Java (clases java.util.concurrent).
El caso de uso fue un simple mapa canónico que reduce la implementación del recuento de caracteres. El conjunto de datos era una colección de cadenas generadas aleatoriamente (400 caracteres de longitud), y calcula el número de vocales en ellas.
Para Akka utilicé un BalancedDispatcher (para el equilibrio de carga entre subprocesos) y RoundRobinRouter (para mantener un límite en mis actores de función). Para Java, utilicé una técnica de unión de horquilla simple (implementada sin ningún algoritmo de robo de trabajo) que mapearía / reduciría las ejecuciones y uniría los resultados. Los resultados intermedios se mantuvieron en colas de bloqueo para que incluso la unión fuera lo más paralela posible. Probablemente, si no me equivoco, imitaría de alguna manera el concepto de "buzón" de los actores de Akka, donde reciben mensajes.
Observación: Hasta cargas medias (~ 50000 entrada de cadena) los resultados fueron comparables, variando ligeramente en diferentes iteraciones. Sin embargo, a medida que aumente mi carga a ~ 100000, colgaría la solución Java. Configuré la solución Java con 20-30 subprocesos bajo esta condición y falló en todas las iteraciones.
Aumentar la carga a 1000000 también fue fatal para Akka. Puedo compartir el código con cualquier persona interesada en realizar una verificación cruzada.
Entonces, para mí, parece que Akka se amplía mejor que la solución multiproceso Java tradicional. Y probablemente la razón es la magia bajo el capó de Scala.
Si puedo modelar un dominio problemático como un mensaje impulsado por un evento que pasa uno, creo que Akka es una buena opción para la JVM.
Prueba realizada en: Versión Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. 3 GB de ram. Procesador Intel Core i5, velocidad de reloj de 2.5 GHz
Tenga en cuenta que el dominio del problema utilizado para la prueba se puede debatir y traté de ser tan justo como lo permitía mi conocimiento de Java :-)