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