Programowanie rozproszone na platformie Akka.NET

Bartosz Sypytkowski

b.sypytkowski@gmail.com

@Horusiath

Agenda

  • Aplikacje rozproszone - teraźniejszość
  • Programowanie w modelu agentowym
  • Przypadki użycia
  • Akka.NET - filozofia
  • Aktorzy i nadzorcy
  • Adresacja aktorów
  • Inne możliwości
  • Remote deployment
  • Klastrowanie
  • Persistence
  • Problemy
  • Wstawka propagandowa

Prawo Moore'a

Prawo Moore'a przestało obowiązywać od 2011 roku

Skalowanie horyzontalne

Systemy rozproszone

Jakieś problemy?

Współdzielenie danych

Zakleszczenia wątków 

Zarządzanie błędami

Komunikacja między maszynami

Debugowanie

Testowanie

Wnioskowanie

Aktorzy

Don't communicate by sharing, share by communicating

  • Brak współdzielonego stanu

  • Lekkie procesy

  • Asynchroniczna wymiana komunikatów

  • Kolejki do buforowania nadchodzących wiadomości

Przypadki użycia

  • Telekomunikacja

  • Gry i multimedia

  • Giełda i finanse

  • Symulacje

  • Data mining

  • Systemy o dużym natężeniu ruchu

Akka.NET

+

=

+

=

Przykład 1

class HelloActor : ReceiveActor
{
    public HelloActor()
    {
        Receive<string>(s => Console.WriteLine(s));
    }
}

using (ActorSystem system = ActorSystem.Create("sys"))
{
    ActorRef aref = system.ActorOf(Props.Create<HelloActor>(), "hello");
    aref.Tell("Hello world");
}

Zarządzanie błędami

Nie wiesz co robić? Zapytaj szefa

Odpowiedzialność osobista

Okupancki zamordyzm

Przykład 2

class Parent : ReceiveActor
{
    private readonly ActorRef child;
    public Parent()
    {
        child = Context.ActorOf(Props.Create<Child>());
        ReceiveAny(msg => child.Forward(msg));
    }

    protected override SupervisorStrategy SupervisorStrategy()
    {
        return new OneForOneStrategy(exc => 
            exc is MyBusinessException 
            ? Directive.Restart 
            : Akka.Actor.SupervisorStrategy.DefaultDecider(exc));
    }
}

class Child : ReceiveActor
{
    public Child()
    {
        ReceiveAny(msg => Sender.Tell(msg));
    }
}

Adresacja

akka://system/user/my-actor
akka.tcp://system@localhost:666/user/my-actor

Adresowanie lokalne

Adresowanie globalne

  • Standardowy format URI
  • Obsługa ścieżek względnych
  • Obsługa symboli specjalnych ("..", "/*")

Routing

Mailboxes

Dispatchers

Schedulers

Event Bus

Logging

Reszta obsady

Dużo?

Monitorowanie

Finite State Machines

Dependency Injection

Stashing

Serializacja

Testing support

Routing

Mailboxes

Dispatchers

Schedulers

Event Bus

Logging

Reszta obsady

Remote deployment

Przykład 3

Config config = FluentConfig.Begin().StartRemotingOn("localhost", 0).Build();
using (ActorSystem system = ActorSystem.Create("sys", config))
{
    var remoteAddress = Address.Parse("akka.tcp://remoteSys@localhost:9000/");
    ActorRef aref = system.ActorOf(
        Props.Create<HelloActor>()
            .WithDeploy(new Deploy(new RemoteScope(remoteAddress))), 
        "hello");
    aref.Tell("Hello world");
}

Klient

Config config = FluentConfig.Begin().StartRemotingOn("localhost", 9000).Build();
using (ActorSystem system = ActorSystem.Create("remoteSys", config))
{
}

Serwer

Klastry

Persistence

... i nie tylko

Problemy

  • Odmienne podejście do rozwiązywania problemów

  • ​Współpraca z TPL

  • Zaawansowane opcje konfiguracji

With great power comes great responsibility

- Uncle Ben, Spiderman

Pamiętaj

Koniec

Programowanie rozproszone na platformie Akka.NET

By Bartosz Sypytkowski

Programowanie rozproszone na platformie Akka.NET

  • 1,337