Mensajería de actores - llpuchaicela/Threads_VS_Actor_Model GitHub Wiki

Mensajería de actores

Para interactuar entre sí, los actores pueden enviar y recibir mensaje de cualquier otro actor del sistema. Estos mensajes pueden ser cualquier tipo de objeto con la condición de que sea inmutable.

Es una buena práctica definir los mensajes dentro de la clase actor. Esto ayuda a escribir código que es fácil de entender y saber qué mensajes puede manejar un actor.

Enviando mensajes

Dentro del sistema de actores de Akka, los mensajes se envían utilizando métodos:

  • tell()
  • ask()
  • forward()

Cuando queremos enviar un mensaje y no esperamos una respuesta, podemos usar el método tell().Este es el método más eficiente desde una perspectiva de rendimiento.

  • El primer parámetro representa el mensaje que enviamos a la dirección del actor readActorRef.
  • El segundo parámetro especifica quien es el remitente. Esto es útil cuando el actor que recibe el mensaje necesita enviar una respuesta a un actor que no sea el remitente (por ejemplo, el padre del actor que envía).
  • Por lo general, podemos establecer el segundo parámetro en nulo o ActorRef.noSender(), porque no esperamos una respuesta. Cuando necesitamos una respuesta de un actor, podemos usar el método ask():

Recibir mensajes

Cada actor implementará el método createReceive(), que maneja todos los mensajes entrantes. ReceiveBuilder() actúa como una declaración de cambio, tratando de hacer coincidir el mensaje recibido con el tipo de mensajes definidos:

Matar a un actor

Cuando terminamos de usar un actor, podemos detenerlo llamando al método stop() desde la interfaz ActorRefFactory:

1 system.stop(myActorRef);

Podemos usar este método para terminar con cualquier actor secundario o con el propio actor.

Es importante tener en cuenta que la detención se realiza de forma asíncrona y que el procesamiento del mensaje actual finalizará antes de que finalice el actor. No se aceptarán más mensajes entrantes en el buzón del actor.

Es importante tomar en cuenta las siguientes características al momento de implementar el código

  • Al detener a un actor principal, también enviaremos una señal de muerte a todos los actores secundarios que generó.
  • Cuando ya no necesitemos el sistema actor, podemos terminarlo para liberar todos los recursos y evitar pérdidas de memoria.
  • Esto detendrá a los actores guardianes del sistema, por lo tanto, a todos los actores definidos en este sistema Akka.
  • También podríamos enviar un mensaje de PoisonPill a cualquier actor que queramos matar:
1 myActorRef.tell(PoisonPill.getInstance(), ActorRef.noSender());
  • El actor recibirá el mensaje de PoisonPill como cualquier otro mensaje y lo pondrá en la cola. El actor procesará todos los mensajes hasta llegar al de PoisonPill. Solo entonces el actor comenzará el proceso de terminación.
  • Otro mensaje especial utilizado para matar a un actor es el mensaje Kill. A diferencia de PoisonPill, el actor lanzará una ActorKilledException al procesar este mensaje:
1 myActorRef.tell(Kill.getInstance(), ActorRef.noSender());