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

Post on 11-Feb-2017

162 views 6 download

Transcript of Никита Цуканов "Параллелизм и распределённые...

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://my-system@192.168.1.15: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: nikita.d.tsukanov@gmail.comSkype: kekekeks

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

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