tutorial streams play latest framework scala akka

scala - streams - akka wikipedia



Akka: ¿Cuántas instancias de un actor deberías crear? (5)

Soy nuevo en el framework Akka y estoy construyendo una aplicación de servidor HTTP sobre Netty + Akka.

Mi idea hasta ahora es crear un actor para cada tipo de solicitud. Por ejemplo, tendría un actor para un POST / my-resource y otro actor para un GET to / my-resource.

¿Dónde estoy confundido es cómo debo ir sobre la creación de actores? Debería:

  1. Crear un nuevo actor para cada solicitud (con esto quiero decir para cada solicitud, ¿debería hacer un TypedActor.newInstance () del actor apropiado)? ¿Qué tan caro es crear un nuevo actor?

  2. Crear una instancia de cada actor en el inicio del servidor y utilizar esa instancia actor para cada solicitud? He leído que un actor solo puede procesar un mensaje a la vez, ¿no podría ser esto un cuello de botella?

  3. ¿Hacer algo más?

Gracias por cualquier comentario.


  1. Es una opción bastante razonable, pero el hecho de que sea adecuado depende de los detalles del manejo de su solicitud.

  2. Sí, por supuesto que podría.

  3. En muchos casos, lo mejor sería tener un solo actor respondiendo a cada solicitud (o tal vez un actor por tipo de solicitud), pero lo único que hace este actor es reenviar la tarea a otro actor (o engendrar un Future ) que realmente hará el trabajo.


Bueno, creas un Actor para cada instancia de estado mutable que quieras administrar.

En su caso, podría tratarse de un solo actor si my-resource es un único objeto y desea tratar cada solicitud en serie, lo que garantiza fácilmente que solo devuelva estados consistentes entre modificaciones.

Si (más probable) gestiona múltiples recursos, un actor por instancia de recurso suele ser ideal, a menos que se encuentre con muchos miles de recursos. Si bien también puedes ejecutar actores por solicitud, terminarás con un diseño extraño si no piensas en el estado al que están accediendo esas solicitudes; por ejemplo, si creas solo un actor por solicitud POST, te sentirás preocupado. cómo evitar que modifiquen al mismo tiempo el mismo recurso, lo que es una clara indicación de que has definido a tus actores de manera equivocada.

Normalmente tengo actores de solicitud / respuesta bastante triviales cuyo objetivo principal es abstraer la comunicación con sistemas externos. Su comunicación con los actores de "instancia" normalmente se limita a un par de solicitud / respuesta para realizar la acción real.


Las opciones 1) o 2) tienen sus inconvenientes. Entonces, usemos las opciones 3) Routing (Akka 2.0+)

El enrutador es un elemento que actúa como equilibrador de carga, enrutando las solicitudes a otros actores que realizarán la tarea necesaria.

Los proveedores de Akka implementan diferentes enrutadores con una lógica diferente para enrutar un mensaje (por ejemplo, SmallestMailboxPool o RoundRobinPool).

Cada enrutador puede tener varios hijos y su tarea es supervisar su buzón para decidir dónde enrutar el mensaje recibido.

//This will create 5 instances of the actor ExampleActor //managed and supervised by a RoundRobinRouter ActorRef roundRobinRouter = getContext().actorOf( Props.create(ExampleActor.class).withRouter(new RoundRobinRouter(5)),"router");

Este procedimiento está bien explicado en este blog .


Para ampliar el manejo de las solicitudes en serie, agregue un actor principal ( Supervisor ) que a su vez delegará a los actores trabajadores ( Children ) ( moda por turnos).


Si está usando Akka, puede crear un actor por solicitud. Akka es extremadamente delgada en recursos y puede crear literalmente millones de actores en un montón bastante común de JVM. Además, solo consumirán cpu / stack / threads cuando realmente hacen algo.

Hace un año hice una comparison entre el consumo de recursos de los actores estándar basados ​​en temas y basados ​​en eventos. Y Akka es incluso mejor que la base de eventos.

Uno de los puntos principales de Akka en mi opinión es que le permite diseñar su sistema como "un actor por uso" donde los sistemas de actores anteriores a menudo lo obligaban a hacer "usar solo actores para servicios compartidos" debido a la sobrecarga de recursos.

Yo recomendaría que vaya por la opción 1.