Archive for the 'Aktores' Category

Aktores Implementando Akka Actor Model en C# (2) Un simple Ejemplo

Saturday, December 13th, 2014

Anterior Post

Veamos hoy un simple ejemplo que crea dos actores y les envía mensaje. El código completo está en:

https://github.com/ajlopez/Aktores/tree/master/Samples/PingPong

Como siempre, todo es “trabajo en progreso”, y puede cambiar en el futuro. Estoy siguiendo el flujo de trabajo de TDD (Test-Driven Development), así que alguna llamada a la API puede ir cambiado, o cambiar algún concepto de base, a medida que me planteo casos de uso cada vez más interesantes (ya llegué a implementar caso de uso distribuido, por ejemplo).

En este ejemplo, tenemos un actor:

using Aktores.Core;

public class PingActor : Actor
{
    private int messagecount;

    public int MessageCount { get { return this.messagecount; } }

    public override void Receive(object message)
    {
        messagecount++;
        this.Sender.Tell("ping", this.Self);
    }
}

Vean que un actor desciende de una clase base Actor. El gran método a implementar es el Receive, que recibe un mensaje enviado por alguien en el sistema (otro actor, otro objeto) a nuestra instancia. Aktores se asegura que los mensajes nos lleguen y se procesen de a uno por vez. En el actor de arriba, una vez recibido un mensaje, incrementa un contador y le responde al enviador del mensaje original con otro mensaje (el enviador está referenciado en this.Self, DURANTE el proceso de un mensaje; luego puede cambiar al llegar otro mensaje).

Otro actor similar:

using Aktores.Core;

public class PongActor : Actor
{
    private int messagecount;

    public int MessageCount { get { return this.messagecount; } }

    public override void Receive(object message)
    {
        messagecount++;
        this.Sender.Tell("pong", this.Self);
    }
}

El programa principal, lo que hace, es crear un sistema de actores, crear dos actores, uno del tipo Ping y otro del tipo Pong, y luego le envía mensajes a procesar:

public static void Main(string[] args)
{
    ActorSystem system = new ActorSystem(2);
    var pingactor = new PingActor();
    var pongactor = new PongActor();
    
    var ping = system.ActorOf(pingactor);
    var pong = system.ActorOf(pongactor);

    for (int k = 0; k < 10; k++)
    {
        ping.Tell("pong", pong);
        pong.Tell("ping", ping);
    }

    // ....
}

Tiene código adicional para medir la cantidad de mensajes que se procesan en el tiempo. El parámetro 2 en el constructor de ActorSystem indica que necesita DOS threads de trabajo interno para procesar mensajes. Deberé revisar si esa información queda ahí o de otra manera. Dos threads son suficientes porque no tenemos más que dos instancias de actores, pero podríamos poner otro número si usamos más actores.

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez