Доклад с митапа MSK .NET Community (http://mskdotnet.org).
В современном мире уже нельзя писать код, который работает на одном компьютере на одном процессорном ядре и имеет монопольный доступ к данным. Опытом борьбы с трудностями при написании многопоточного кода поделится Никита Цуканов.
Доклад "Параллелизм и распределённые вычисления на акторах с Akka.NET" рассчитан на неподготовленного слушателя, ранее не имевшего дело с акторами, и является улучшенной и дополненной версией доклада с питерского DotNext. 11 августа речь пойдёт непосредственно об акторной модели и её реализации в Akka.NET, особенностях юнит-тестирования, акторах с сохраняемым состоянием, а так же об интеграции всей этой машинерии с имеющимся приложением и ASP.NET.
14. 14
Это — единица организации программного кода
Что такое Актор?
ООП
Поведение
Состояние
Синхронные* вызовы
Акторы
Поведение
Состояние
Асинхронные сообщения
15. 15
Это — единица организации программного кода
Что такое Актор?
ООП
Поведение
Состояние
Синхронные* вызовы
Акторы
Поведение
Состояние
Асинхронные сообщения
Не нужно думать о:
- разделяемом состоянии
- видимости состояния
- потоках, блокировках, конкурентных коллекциях, и т. п.
17. 17
Актор можно использовать как...
● поток
● экземпляр объекта/компонента
● колбек/подписчик
● синглетон или сервис (например, слой работы с бд)
● маршрутизатор, балансировщик, пул
● сервис вне текущего процесса
● конечный автомат
21. 21
public class GreetingActor : ReceiveActor
{
public class Greet
{
public string Who { get; private set; }
public Greet(string who)
{
Who = who;
}
}
public GreetingActor()
{
Receive<Greet>(greet => Console.WriteLine(greet.Who));
}
}
22. 22
var system = ActorSystem.Create("my-system");
var actorRef = system.ActorOf<GreetingActor>("my-actor");
actorRef.Tell(new GreetingActor.Greet("World"));
23. 23
var system = ActorSystem.Create("my-system");
var actorRef = system.ActorOf(Props.Create<GreetingActor>()
.WithRouter(new RoundRobinPool(10)),
"my-actor");
actorRef.Tell(new GreetingActor.Greet("World"));
24. 24
var system = ActorSystem.Create("my-system");
var actorRef = system.ActorOf(Props.Create<GreetingActor>()
.WithDeploy(new Deploy(new RemoteScope(
Address.Parse("akka.tcp://my-system@192.168.1.15:6001")))),
"my-actor");
actorRef.Tell(new GreetingActor.Greet("World"));
51. 51
protected override SupervisorStrategy SupervisorStrategy()
{
return new OneForOneStrategy(5, new TimeSpan(0, 1, 0), e =>
e is ArithmeticException ? Directive.Resume
: e is IOException ? Directive.Restart
: Directive.Escalate);
}
68. 68
Akka.Routing
По контролю времени жизни:
- Pool
- Group
По логике маршрутизации
● RandomRouter
● SmallestMailboxRouter
● BroadcastRouter
● RoundRobinRouter
● ConsistentHashRouter
● ScatterGatherFirstCompletedRouter
● TailChoppingRouter