Никита Цуканов "Параллелизм и распределённые...
TRANSCRIPT
1
Akka.NET
2
1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 20160
500
1000
1500
2000
2500
3000
3500
4000
0
10
20
30
40
50
60
70
1 1 1 1 1 1 1 1 1 2 24 4
8 8
16 16
32 32
64
200300
400500
1000
1800
2530
3200
3600
2200
29303000
32003330 3330
3150 3200 3150 3150 3150
Тактовая частота и количество ядер по годам
Частота (МГц) Ядра
3
4
Многопоточность
Ожидания
Реальность
5
6
Вертикальное масштабирование
7
Вертикальное масштабирование
Горизонтальное масштабирование
8
Вертикальное масштабирование
Горизонтальное масштабирование Эластичность
9
Вертикальное масштабирование
Горизонтальное масштабирование Эластичность
Parallel LinqTPL – async/await
Потоки
10
Вертикальное масштабирование
Горизонтальное масштабирование Эластичность
Parallel LinqTPL – async/await
Потоки
WCFWeb API
ServiceStackMSMQ
11
Вертикальное масштабирование
Горизонтальное масштабирование Эластичность
Parallel LinqTPL – async/await
Потоки
WCFWeb API
ServiceStackMSMQ
12
Что такое Актор?
13
Это — единица организации программного кода
Что такое Актор?
14
Это — единица организации программного кода
Что такое Актор?
ООП
ПоведениеСостояние
Синхронные* вызовы
Акторы
ПоведениеСостояние
Асинхронные сообщения
15
Это — единица организации программного кода
Что такое Актор?
ООП
ПоведениеСостояние
Синхронные* вызовы
Акторы
ПоведениеСостояние
Асинхронные сообщения
Не нужно думать о:
- разделяемом состоянии- видимости состояния
- потоках, блокировках, конкурентных коллекциях, и т. п.
16
Th
read
Pool Actor
1Actor
1Actor
1Actor
1Actor
2Actor
2
Actor2Actor2 Actor3
Actor3
Actor4
Actor4 Actor4Actor4
Actor1Actor1
Actor3Actor3 Actor4Actor4
Actor2Actor2
Actor1Actor1
Actor3Actor3
Actor2Actor2
Time
● Акторы работают в фиксированном пуле потоков, равномерно распределяя нагрузку между ядрами, нет лишних переключений контекста.
● Есть возможность управлять тем, где и как будет выполняться актор.
17
Актор можно использовать как...
● поток● экземпляр объекта/компонента● колбек/подписчик● синглетон или сервис (например, слой работы с бд)● маршрутизатор, балансировщик, пул● сервис вне текущего процесса● конечный автомат
18
Модель акторов используют:
● Erlang● Facebook WhatsApp (Erlang)● RabbitMQ (Erlang)● CouchDB (Erlang)● LinkedIn.com (JVM Akka)● Walmart.com (JVM Akka)● Blizzard (JVM Akka)
19
Анатомия актора
ActorRefActorRefActorRefActorRef
АкторАктор
СостояниеСостояние
НадзорНадзор
Дочерние акторы
Дочерние акторы
Почтовый ящик
ПоведениеПоведение
Транспорт
20
Действия с акторами
1) Define
2) Create
3) Send
4) Become
5) Supervise
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
var system = ActorSystem.Create("my-system");var actorRef = system.ActorOf<GreetingActor>("my-actor");actorRef.Tell(new GreetingActor.Greet("World"));
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
var system = ActorSystem.Create("my-system");var actorRef = system.ActorOf(Props.Create<GreetingActor>() .WithDeploy(new Deploy(new RemoteScope( Address.Parse("akka.tcp://[email protected]:6001")))), "my-actor");
actorRef.Tell(new GreetingActor.Greet("World"));
25
user
/
sys
26
a1
user
/
sys
27a2 a3
a1
user
/
sys
28
a4 a5
a2 a3
a1
user
/
sys
29
a4 a5
a2 a3
a1
user
/
sys
30
a4 a5
a2 a3
a1
user
/
sys
31
a4 a5
a2 a3
a1
user
/
sys
/user/a1/a2/a5
32
Обработка исключений в C, C#, Java...
33
34
35
Error Kernel
36
/
37
/
38
/
39
/
40
/
41
/
42
/
43
/
44
/
45
/
46
/
47
/
48
/
49
/
50
Другой компьютер/процесс
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);
}
52
State Machine Demo
53
ASP.NET Demo
54
Akka.Persistence
55
События
Запросы
Команды
CQRS(Command/Query Request Separation)
Потребитель(UI, слой API, etc)
Доменная модельМодель для чтения
База для чтенияБаза для записи
и работы доменной модели
56
Akka.Cluster
Seed Node
57
Akka.Cluster
Node
Seed Node
58
Akka.Cluster
Node
Seed Node
59
Akka.Cluster
Node
Seed Node
Node
60
Akka.Cluster
Node
Seed Node
Node
61
Akka.Cluster
Node
Seed Node
Node
62
Akka.Cluster
Node
Seed Node
Node
Node
63
Akka.Cluster
Node
Seed Node
Node
Node
64
Akka.Cluster
Node
Seed Node
Node
Node
65
Akka.Cluster
Node
Seed Node
Node
Node
66
Akka.Cluster
Node
Seed Node
Node
Node
67
Akka.Cluster
Node
Seed Node
Node
Node
Node
68
Akka.Routing
По контролю времени жизни:- Pool- Group
По логике маршрутизации● RandomRouter● SmallestMailboxRouter● BroadcastRouter● RoundRobinRouter● ConsistentHashRouter● ScatterGatherFirstCompletedRouter● TailChoppingRouter
69
RoundRobinRouter
12
1
2
3
34
4
Router
Routee1
Routee2
Routee3
70
BroadcastRouter
12
12
12
12
Router Routee2
Routee3
Routee1Шлёт всемШлёт всем
71
Routee1
Routee2
Routee3
?
?
?
?
Sender !
Шлём всем, получаем первый ответ, отправляем запрашивающему(Task.WaitAny)
Шлём всем, получаем первый ответ, отправляем запрашивающему(Task.WaitAny)
ScatterGatherFirstCompletedRouter
Router
72
Routee1
Routee2
Routee3
Sender
TailChoppingRouter
Router
73
Routee1
Routee2
Routee3
?Sender
TailChoppingRouter
Router
74
Routee1
Routee2
Routee3
?
?
Sender
TailChoppingRouter
Router
75
Routee1
Routee2
Routee3
?
?
Sender
TailChoppingRouter
Router
Routee1
76
Routee1
Routee2
Routee3
?
?
Sender
TailChoppingRouter
Router ?
Routee1
77
Routee1
Routee2
Routee3
?
?
Sender
TailChoppingRouter
Router ?
Routee1
Routee2
78
Routee1
Routee2
Routee3
?
?
Sender
TailChoppingRouter
Router ?
Routee1
Routee2 !
79
Routee1
Routee2
Routee3
?
?
Sender !
TailChoppingRouter
Router ?
Routee1
Routee2 !
80
Routee1
Routee2
Routee3
?
?
Sender !
Шлёт случайному, если не получает ответа, шлёт следующему
Шлёт случайному, если не получает ответа, шлёт следующему
TailChoppingRouter
Router ?
Routee1
Routee2 !
81
ConsistentHashRouter
ZY
Z
Y
X
AX
A
Router
Routee1
Routee2
Routee3
Одинаковый «индекс хэша»Одинаковый «индекс хэша»
«индекс хэша» привязан к актору«индекс хэша» привязан к актору
82
Akka.Cluster.Sharding
Shard Shard Shard Shard Shard Shard
Shard Shard Shard
83
Akka.NET Спикер Сайтhttp://getakka.net/Блог разработчиков https://petabridge.com/blog/
Никита ЦукановEmail: [email protected]: kekekeks
Код из презентации:
https://github.com/kekekeks/msk.net-2016-08-11