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,440