sirve settitle que partir para generar diagrama codigo clases java scala asynchronous use-case akka

java - settitle - Buen caso de uso para Akka



plantuml netbeans (12)

He escuchado muchas críticas sobre el marco Akka (plataforma de servicio Java / Scala), pero hasta ahora no he visto muchos ejemplos reales de casos de uso para los que sería bueno. Por lo tanto, me interesaría escuchar cosas que los desarrolladores hayan usado con éxito.

Solo una limitación: por favor no incluya el caso de escribir un servidor de chat. (¿por qué? ya que esto se ha usado en exceso como ejemplo para muchas cosas similares)


Descargo de responsabilidad: yo soy el PO de Akka

Además de ofrecer una mezcla heterogénea de concurrencia que es mucho más simple de razonar y corregir (actores, agentes, concurrencia de flujo de datos) y con control de concurrencia en la forma de STM.

Aquí hay algunos casos de uso que podría considerar:

  1. Procesamiento de transacciones (juegos en línea, finanzas, estadísticas, apuestas, redes sociales, telecomunicaciones, ...)
    • ampliación, ampliación, tolerancia a fallos / HA
  2. Servicio backend (cualquier industria, cualquier aplicación)
    • Servicio REST, SOAP, cometd etc
    • actuar como centro de mensajes / capa de integración
    • ampliación, ampliación, tolerancia a fallos / HA
  3. Snap-in concurrency / paralelismo (cualquier aplicación)
    • Correcto
    • Fácil de trabajar y entender.
    • Solo agregue los archivos jar a su proyecto JVM existente (use Scala, Java, Groovy o JRuby)
  4. Procesamiento por lotes (cualquier industria)
    • Integración de Camel para conectar con fuentes de datos por lotes
    • Los actores dividen y conquistan las cargas de trabajo por lotes.
  5. Centro de comunicaciones (telecomunicaciones, medios web, medios móviles)
    • ampliación, ampliación, tolerancia a fallos / HA
  6. Servidor de juegos (juegos en línea, apuestas)
    • ampliación, ampliación, tolerancia a fallos / HA
  7. BI / datamining / crujido de propósito general
    • ampliación, ampliación, tolerancia a fallos / HA
  8. inserte otros buenos casos de uso aquí

Estaba probando Akka (api de Java). Lo que intenté fue comparar el modelo de concurrencia basado en el actor de Akka con el del modelo de concurrencia simple de Java (clases java.util.concurrent).

El caso de uso fue un mapa canónico simple que reduce la implementación del conteo de caracteres. El conjunto de datos fue una colección de cadenas generadas aleatoriamente (400 caracteres de longitud), y calcular el número de vocales en ellas.

Para Akka usé un BalancedDispatcher (para equilibrar la carga entre subprocesos) y RoundRobinRouter (para mantener un límite en mis actores de función). Para Java, utilicé la técnica simple de unión de bifurcaciones (implementada sin ningún algoritmo de robo de trabajo) que pudiera bifurcar el mapa / reducir ejecuciones y unir los resultados. Los resultados intermedios se mantuvieron en colas de bloqueo para que incluso la unión sea lo más paralela posible. Probablemente, si no me equivoco, eso imitaría de alguna manera el concepto de "buzón" de los actores Akka, donde reciben mensajes.

Observación: Hasta las cargas medias (~ 50000 entrada de cadena) los resultados fueron comparables, variando ligeramente en diferentes iteraciones. Sin embargo, como aumenté mi carga a ~ 100000, colgaría la solución Java. Configuré la solución Java con 20-30 hilos en esta condición y falló en todas las iteraciones.

Aumentar la carga a 1000000, fue fatal para Akka también. Puedo compartir el código con cualquier persona interesada para tener una verificación cruzada.

Entonces, para mí, parece que Akka se amplía mejor que la solución multiproceso tradicional de Java. Y probablemente la razón es la magia bajo el capó de Scala.

Si puedo modelar un dominio problemático como un mensaje dirigido por un evento que pasa uno, creo que Akka es una buena opción para la JVM.

Prueba realizada en: Versión de Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. 3GB 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 mi conocimiento de Java permitió :-)


Estamos utilizando Akka en un proyecto de Telco a gran escala (desafortunadamente no puedo revelar muchos detalles). Los actores Akka se implementan y se accede de forma remota mediante una aplicación web. De esta manera, tenemos un modelo RPC simplificado basado en protobuffer de Google y logramos el paralelismo utilizando Akka Futures. Hasta ahora, este modelo ha funcionado de manera brillante. Una nota: estamos utilizando la API de Java.


Estamos utilizando akka con su complemento de camello para distribuir nuestro análisis y el procesamiento de tendencias para twimpact.com . Tenemos que procesar entre 50 y 1000 mensajes por segundo. Además del procesamiento de varios nodos con camello, también se utiliza para distribuir el trabajo en un solo procesador a varios trabajadores para obtener el máximo rendimiento. Funciona bastante bien, pero requiere cierta comprensión de cómo manejar las congestiones.


Lo he usado hasta ahora en dos proyectos reales con mucho éxito. ambos se encuentran en el campo de información de tráfico casi en tiempo real (tráfico como en automóviles en autopistas), distribuidos en varios nodos, integrando mensajes entre varias partes, sistemas backend confiables. No tengo la libertad de dar detalles específicos sobre los clientes aún, cuando obtengo la autorización, tal vez se pueda agregar como referencia.

Akka realmente ha superado esos proyectos, aunque empezamos cuando estaba en la versión 0.7. (Estamos usando Scala por cierto)

Una de las grandes ventajas es la facilidad con la que puede componer un sistema de actores y mensajes casi sin repetirse, se escala extremadamente bien sin todas las complejidades de los hilos enrollados a mano y recibe mensajes asíncronos que pasan de un objeto a otro casi de forma gratuita.

Es muy bueno para modelar cualquier tipo de manejo asíncrono de mensajes. Preferiría escribir cualquier tipo de sistema de servicios (web) en este estilo que cualquier otro estilo. (¿Alguna vez ha intentado escribir un servicio web asíncrono (lado del servidor) con JAX-WS? Eso es mucha plomería). Así que diría que cualquier sistema que no quiera colgarse en uno de sus componentes porque todo se llama implícitamente mediante métodos síncronos, y ese componente se está bloqueando en algo. Es muy estable y la solución para fallar y dejar que se bloquee + supervisor realmente funciona bien. Todo es fácil de configurar mediante programación y no es difícil realizar una prueba unitaria.

Luego están los excelentes módulos adicionales. El módulo Camel realmente se conecta bien con Akka y permite un desarrollo tan fácil de servicios asíncronos con puntos finales configurables.

Estoy muy contento con el marco y se está convirtiendo en un estándar de facto para los sistemas conectados que construimos.


Puedes usar Akka para diferentes tipos de cosas.

Estaba trabajando en un sitio web, donde migré la pila de tecnología a Scala y Akka. Lo usamos para casi todo lo que sucedió en el sitio web. Aunque pienses que un ejemplo de chat es malo, todos son básicamente lo mismo:

  • Actualizaciones en vivo en el sitio web (por ejemplo, vistas, me gusta, ...)
  • Mostrando comentarios de usuarios en vivo
  • Servicios de notificación
  • Búsqueda y todo tipo de servicios.

Especialmente las actualizaciones en vivo son fáciles ya que se reducen a lo que es un ejemplo de Chat. La parte de servicios es otro tema interesante porque simplemente puede elegir usar actores remotos e incluso si su aplicación no está agrupada, puede implementarla en diferentes máquinas con facilidad.

También estoy usando Akka para una aplicación de enrutador automático de PCB con la idea de poder escalar desde una computadora portátil a un centro de datos. Cuanto más poder le des, mejor será el resultado. Esto es extremadamente difícil de implementar si intenta usar la concurrencia habitual porque Akka también le da transparencia de ubicación.

Actualmente, como proyecto de tiempo libre, estoy construyendo un marco web utilizando solo actores. Nuevamente, los beneficios son la escalabilidad de una sola máquina a todo un grupo de máquinas. Además, el uso de un enfoque dirigido por mensajes hace que su servicio de software esté orientado desde el principio. Usted tiene todos esos componentes agradables, hablando entre sí pero no necesariamente conociéndose, viviendo en la misma máquina, ni siquiera en el mismo centro de datos.

Y desde que Google Reader se cerró, comencé con un lector de RSS, usando Akka, por supuesto. Se trata de servicios encapsulados para mí. Como conclusión: el modelo de actor en sí es lo que debe adoptar primero y Akka es un marco muy confiable que lo ayuda a implementarlo con una gran cantidad de beneficios que recibirá en el camino.


Recientemente he implemented el ejemplo de reducción de mapa canónico en Akka: Word count. Así que es un caso de uso de Akka: mejor rendimiento. Fue más un experimento de los actores de JRuby y Akka que cualquier otra cosa, pero también muestra que Akka no es solo Scala o Java: funciona en todos los idiomas además de JVM.


Si abstraes el nivel del servidor de chat, obtendrás la respuesta.

Akka proporciona un sistema de mensajería que es similar a la mentalidad de "déjalo chocar" de Erlang.

Por lo tanto, los ejemplos son cosas que necesitan diferentes niveles de durabilidad y confiabilidad de la mensajería:

  • Servidor de chat
  • Capa de red para un MMO
  • Bomba de datos financieros
  • Sistema de notificación para iPhone / móvil / cualquier aplicación.
  • Servidor REST
  • Tal vez algo parecido a WebMachine (supongo)

Lo bueno de Akka son las opciones que ofrece para la persistencia, su implementación STM, el servidor REST y la tolerancia a fallos.

No se moleste con el ejemplo de un servidor de chat, piense en ello como un ejemplo de una cierta clase de solución.

Con toda su excelente documentación, siento que una brecha es esta pregunta exacta, casos de uso y ejemplos. Teniendo en cuenta los ejemplos no son triviales.

(Escrito con la única experiencia de ver videos y jugar con la fuente, no he implementado nada usando akka).


Un ejemplo de cómo lo usamos sería en una cola de prioridad de transacciones de tarjetas de débito / crédito. Tenemos millones de estos y el esfuerzo del trabajo depende del tipo de cadena de entrada. Si la transacción es de tipo CHECK, tenemos muy poco procesamiento, pero si es un punto de venta, hay mucho por hacer, como fusionar con metadatos (categoría, etiqueta, etiquetas, etc.) y proporcionar servicios (alertas de correo electrónico / sms, detección de fraudes, bajo saldo de fondos, etc). Basándonos en el tipo de entrada, componemos las clases de varios rasgos (llamados mixins) necesarios para manejar el trabajo y luego realizar el trabajo. Todos estos trabajos entran en la misma cola en tiempo real desde diferentes instituciones financieras. Una vez que se limpian los datos, se envían a diferentes almacenes de datos para persistencia, análisis, o se envían a una conexión de socket, o al actor de cometa Lift. Los actores que trabajan se cargan constantemente y equilibran el trabajo para que podamos procesar los datos lo más rápido posible. También podemos incluir servicios adicionales, modelos de persistencia y stm para puntos de decisión críticos.

El mensaje de estilo Erlang OTP que pasa en la JVM es un gran sistema para desarrollar sistemas en tiempo real sobre las bibliotecas y servidores de aplicaciones existentes.

Akka le permite hacer el paso de mensajes como lo haría en un esb tradicional pero con velocidad! También le proporciona herramientas en el marco para administrar la gran cantidad de grupos de actores, nodos remotos y tolerancia a fallos que necesita para su solución.


Utilizamos Akka en sistemas de diálogo hablado ( primetalk ). Tanto interna como externamente. Para ejecutar simultáneamente una gran cantidad de canales de telefonía en un solo nodo de clúster, obviamente es necesario contar con un marco de multiproceso. Akka funciona simplemente perfecto. Tenemos pesadilla anterior con la java-concurrencia. Y con Akka es como un columpio, simplemente funciona. Robusto y fiable. 24 * 7, sin parar.

Dentro de un canal tenemos un flujo de eventos en tiempo real que se procesan en paralelo. En particular: - el reconocimiento automático de voz prolongado - se realiza con un actor; - productor de salida de audio que mezcla algunas fuentes de audio (incluida la voz sintetizada); - la conversión de texto a voz es un conjunto separado de actores compartidos entre canales; - Procesamiento semántico y de conocimiento.

Para hacer interconexiones de procesamiento de señales complejas usamos SynapseGrid . Tiene la ventaja de la verificación en tiempo de compilación del flujo de datos en los sistemas de actores complejos.


Utilizamos Akka en varios proyectos en el trabajo, el más interesante de los cuales está relacionado con la reparación de accidentes de vehículos. Principalmente en el Reino Unido, pero ahora se está expandiendo a los Estados Unidos, Asia, Australasia y Europa. Utilizamos actores para garantizar que la información de reparación de choques se proporcione en tiempo real para permitir la reparación segura y económica de los vehículos.

La pregunta con Akka es realmente más "¿qué no puedes hacer con Akka?". Su capacidad para integrarse con marcos poderosos, su poderosa abstracción y todos los aspectos de tolerancia a fallas lo convierten en un conjunto de herramientas muy completo.


Utilizamos Akka para procesar llamadas REST de forma asíncrona. Junto con el servidor web asíncrono (basado en Netty), podemos lograr una mejora de 10 veces en la cantidad de usuarios atendidos por nodo / servidor, en comparación con el hilo tradicional por modelo de solicitud de usuario.

¡Dígale a su jefe que su factura de alojamiento de AWS se reducirá en un factor de 10 y es una obviedad! Shh ... no se lo digas a Amazon aunque ... :)