83
1 Akka.NET

Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

Embed Size (px)

Citation preview

Page 1: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

1

Akka.NET

Page 2: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с 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

Тактовая частота и количество ядер по годам

Частота (МГц) Ядра

Page 3: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

3

Page 4: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

4

Многопоточность

Ожидания

Реальность

Page 5: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

5

Page 6: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

6

Вертикальное масштабирование

Page 7: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

7

Вертикальное масштабирование

Горизонтальное масштабирование

Page 8: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

8

Вертикальное масштабирование

Горизонтальное масштабирование Эластичность

Page 9: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

9

Вертикальное масштабирование

Горизонтальное масштабирование Эластичность

Parallel LinqTPL – async/await

Потоки

Page 10: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

10

Вертикальное масштабирование

Горизонтальное масштабирование Эластичность

Parallel LinqTPL – async/await

Потоки

WCFWeb API

ServiceStackMSMQ

Page 11: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

11

Вертикальное масштабирование

Горизонтальное масштабирование Эластичность

Parallel LinqTPL – async/await

Потоки

WCFWeb API

ServiceStackMSMQ

Page 12: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

12

Что такое Актор?

Page 13: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

13

Это — единица организации программного кода

Что такое Актор?

Page 14: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

14

Это — единица организации программного кода

Что такое Актор?

ООП

ПоведениеСостояние

Синхронные* вызовы

Акторы

ПоведениеСостояние

Асинхронные сообщения

Page 15: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

15

Это — единица организации программного кода

Что такое Актор?

ООП

ПоведениеСостояние

Синхронные* вызовы

Акторы

ПоведениеСостояние

Асинхронные сообщения

Не нужно думать о:

- разделяемом состоянии- видимости состояния

- потоках, блокировках, конкурентных коллекциях, и т. п.

Page 16: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

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

● Акторы работают в фиксированном пуле потоков, равномерно распределяя нагрузку между ядрами, нет лишних переключений контекста.

● Есть возможность управлять тем, где и как будет выполняться актор.

Page 17: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

17

Актор можно использовать как...

● поток● экземпляр объекта/компонента● колбек/подписчик● синглетон или сервис (например, слой работы с бд)● маршрутизатор, балансировщик, пул● сервис вне текущего процесса● конечный автомат

Page 18: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

18

Модель акторов используют:

● Erlang● Facebook WhatsApp (Erlang)● RabbitMQ (Erlang)● CouchDB (Erlang)● LinkedIn.com (JVM Akka)● Walmart.com (JVM Akka)● Blizzard (JVM Akka)

Page 19: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

19

Анатомия актора

ActorRefActorRefActorRefActorRef

АкторАктор

СостояниеСостояние

НадзорНадзор

Дочерние акторы

Дочерние акторы

Почтовый ящик

ПоведениеПоведение

Транспорт

Page 20: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

20

Действия с акторами

1) Define

2) Create

3) Send

4) Become

5) Supervise

Page 21: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

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));

}

}

Page 22: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

22

var system = ActorSystem.Create("my-system");var actorRef = system.ActorOf<GreetingActor>("my-actor");actorRef.Tell(new GreetingActor.Greet("World"));

Page 23: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

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"));

Page 24: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

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"));

Page 25: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

25

user

/

sys

Page 26: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

26

a1

user

/

sys

Page 27: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

27a2 a3

a1

user

/

sys

Page 28: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

28

a4 a5

a2 a3

a1

user

/

sys

Page 29: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

29

a4 a5

a2 a3

a1

user

/

sys

Page 30: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

30

a4 a5

a2 a3

a1

user

/

sys

Page 31: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

31

a4 a5

a2 a3

a1

user

/

sys

/user/a1/a2/a5

Page 32: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

32

Обработка исключений в C, C#, Java...

Page 33: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

33

Page 34: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

34

Page 35: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

35

Error Kernel

Page 36: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

36

/

Page 37: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

37

/

Page 38: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

38

/

Page 39: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

39

/

Page 40: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

40

/

Page 41: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

41

/

Page 42: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

42

/

Page 43: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

43

/

Page 44: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

44

/

Page 45: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

45

/

Page 46: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

46

/

Page 47: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

47

/

Page 48: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

48

/

Page 49: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

49

/

Page 50: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

50

Другой компьютер/процесс

Page 51: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

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);

}

Page 52: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

52

State Machine Demo

Page 53: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

53

ASP.NET Demo

Page 54: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

54

Akka.Persistence

Page 55: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

55

События

Запросы

Команды

CQRS(Command/Query Request Separation)

Потребитель(UI, слой API, etc)

Доменная модельМодель для чтения

База для чтенияБаза для записи

и работы доменной модели

Page 56: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

56

Akka.Cluster

Seed Node

Page 57: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

57

Akka.Cluster

Node

Seed Node

Page 58: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

58

Akka.Cluster

Node

Seed Node

Page 59: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

59

Akka.Cluster

Node

Seed Node

Node

Page 60: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

60

Akka.Cluster

Node

Seed Node

Node

Page 61: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

61

Akka.Cluster

Node

Seed Node

Node

Page 62: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

62

Akka.Cluster

Node

Seed Node

Node

Node

Page 63: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

63

Akka.Cluster

Node

Seed Node

Node

Node

Page 64: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

64

Akka.Cluster

Node

Seed Node

Node

Node

Page 65: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

65

Akka.Cluster

Node

Seed Node

Node

Node

Page 66: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

66

Akka.Cluster

Node

Seed Node

Node

Node

Page 67: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

67

Akka.Cluster

Node

Seed Node

Node

Node

Node

Page 68: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

68

Akka.Routing

По контролю времени жизни:- Pool- Group

По логике маршрутизации● RandomRouter● SmallestMailboxRouter● BroadcastRouter● RoundRobinRouter● ConsistentHashRouter● ScatterGatherFirstCompletedRouter● TailChoppingRouter

Page 69: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

69

RoundRobinRouter

12

1

2

3

34

4

Router

Routee1

Routee2

Routee3

Page 70: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

70

BroadcastRouter

12

12

12

12

Router Routee2

Routee3

Routee1Шлёт всемШлёт всем

Page 71: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

71

Routee1

Routee2

Routee3

?

?

?

?

Sender !

Шлём всем, получаем первый ответ, отправляем запрашивающему(Task.WaitAny)

Шлём всем, получаем первый ответ, отправляем запрашивающему(Task.WaitAny)

ScatterGatherFirstCompletedRouter

Router

Page 72: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

72

Routee1

Routee2

Routee3

Sender

TailChoppingRouter

Router

Page 73: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

73

Routee1

Routee2

Routee3

?Sender

TailChoppingRouter

Router

Page 74: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

74

Routee1

Routee2

Routee3

?

?

Sender

TailChoppingRouter

Router

Page 75: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

75

Routee1

Routee2

Routee3

?

?

Sender

TailChoppingRouter

Router

Routee1

Page 76: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

76

Routee1

Routee2

Routee3

?

?

Sender

TailChoppingRouter

Router ?

Routee1

Page 77: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

77

Routee1

Routee2

Routee3

?

?

Sender

TailChoppingRouter

Router ?

Routee1

Routee2

Page 78: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

78

Routee1

Routee2

Routee3

?

?

Sender

TailChoppingRouter

Router ?

Routee1

Routee2 !

Page 79: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

79

Routee1

Routee2

Routee3

?

?

Sender !

TailChoppingRouter

Router ?

Routee1

Routee2 !

Page 80: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

80

Routee1

Routee2

Routee3

?

?

Sender !

Шлёт случайному, если не получает ответа, шлёт следующему

Шлёт случайному, если не получает ответа, шлёт следующему

TailChoppingRouter

Router ?

Routee1

Routee2 !

Page 81: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

81

ConsistentHashRouter

ZY

Z

Y

X

AX

A

Router

Routee1

Routee2

Routee3

Одинаковый «индекс хэша»Одинаковый «индекс хэша»

«индекс хэша» привязан к актору«индекс хэша» привязан к актору

Page 82: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

82

Akka.Cluster.Sharding

Shard Shard Shard Shard Shard Shard

Shard Shard Shard

Page 83: Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"

83

Akka.NET Спикер Сайтhttp://getakka.net/Блог разработчиков https://petabridge.com/blog/

Никита ЦукановEmail: [email protected]: kekekeks

Код из презентации:

https://github.com/kekekeks/msk.net-2016-08-11