Construcción de actores en Akka.net

El modelo de actores se caracteriza por establecer un modelo de computación basado en el Reactive Manifesto que nos permite construir:

  • Sistemas altamente concurrentes
  • Sistemas escalables tanto horizontalmente como verticalmente
  • Sistemas fiables y tolerantes a errores

Para empezar vamos a ver como se define un actor ya que tenemos 3 formas distintas dependiendo de nuestras necesidades. Los actores en Akka.net hacen un uso extensivo de pattern matching para seleccionar cómo se van a gestionar los mensajes dependiendo de su tipo o valor.

Para nuestro ejemplo definimos dos simples mensajes POCO:

1
2
3
4
5
6
7
8
public class DoSomething
{
public string MyName { get; set; }
}
public class DoSomethingElse
{
}

Untyped Actor

Es la forma más básica para definir un actor y nos obliga a sobreescribir el método OnReceive. Al ser de más difícil lectura se recomienda la opción TypedActor o ReceiveActor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyUntypedActor : UntypedActor
{
protected override void OnReceive(object message)
{
if (message is DoSomething)
{
Console.WriteLine("DoSomething");
}
else if (message is DoSomethingElse)
{
Console.WriteLine("DoSomethingElse");
}
}
}

TypedActor

Con TypedActor se hace mucho más explícito el tipo de mensajes que un actor puede procesar y aumenta la legibilidad del código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyTypedActor : TypedActor,
IHandle<DoSomething>,
IHandle<DoSomethingElse>
{
public void Handle(DoSomething message)
{
Console.WriteLine("DoSomething");
}
public void Handle(DoSomethingElse message)
{
Console.WriteLine("DoSomethingElse");
}
}

ReceiveActor

ReceiveActor – que hereda de UntypedActor – nos proporciona la capacidad de seleccionar cómo gestionar los mensajes de forma más sofisticada.

En este caso, le decimos que trate de forma distinta los mensajes de tipo DoSomething en que el valor de la propiedad empieza por “Barcelona”. El orden en la declaración es importante!

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyReceiveActor : ReceiveActor
{
public MyReceiveActor()
{
Receive<DoSomething>(
x => x.MyName.StartsWith("Barcelona"),
x => Console.WriteLine("DoSomething -- Barcelona"));
Receive<DoSomething>(
x => Console.WriteLine("DoSomething"));
Receive<DoSomethingElse>(
x => Console.WriteLine("DoSomethingElse"));
}
}

Happy coding!