SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
Actor Model
Курс «Параллельные вычисления»
Цесько Вадим Александрович
http://kspt.ftk.spbstu.ru/people/tsesko/
@incubos
Санкт-Петербургский государственный политехнический университет
29 ноября 2013 г.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 1 / 73
Содержание
1 Введение
2 Actor Model
3 Futures and Promises
4 Dataflow Concurrency
5 Software Transactional Memory
6 Заключение
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 2 / 73
Введение Обо мне
Обо мне
5 лет в Digitek Labs
Параллельные системы цифровой обработки
сигналов
Статический анализ кода программных систем
2.5 года в Яндекс
Распределённые высоконагруженные системы
Преподавание
Базы данных
Формальные методы обеспечения качества ПО
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 3 / 73
Введение Disclaimer
Disclaimer
If I had asked people what
they wanted, they would
have said faster horses.
Henry Ford
Must Watch
Jonas Bon´er. State: You’re Doing It Wrong — Alternative
Concurrency Paradigms For The JVMa
. JavaOne 2009.
a
http://www.slideshare.net/jboner/
state-youre-doing-it-wrong-javaone-2009
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 4 / 73
Введение Параллельное программирование
Параллельное программирование
Damien Katz
Beginner: "Threads are hard."
Intermediate: "Don’t fear multithreading."
Expert: "Threads are hard."
Тем не менее
The free lunch is overa
.
a
Herb Sutter. The Free Lunch Is Over. 2009
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 5 / 73
Введение Проблема
Проблема
Источник боли
Разделяемое состояние.
А если точнее, то
Изменяемое разделяемое состояние.
И
Часто оно неизбежно.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 6 / 73
Введение Классификация задач и подходов
Классификация задач и подходов
Shared State Concurrency (чугунная пуля)
Невероятно сложно
Даже для экспертов
Координация независимых задач/процессов
Планирование, игры
Message-Passing Concurrency (Actor Model)
Workflow-зависимые процессы
Банковская сфера, MapReduce
Dataflow Concurrency
Консенсус и истинное разделяемое знание
Банковская сфера
Software Transactional Memory (STM)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 7 / 73
Actor Model Происхождение
Происхождение
Carl Hewitt1
, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formalism for Artificial
Intelligence. 1973.
Gul Agha. Actors: A Model of Concurrent
Computation in Distributed Systems. 1986.
Изначально для описания параллельных
вычислений
Позднее в качестве основы для многочисленных
реализаций
1
http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 8 / 73
Actor Model Actor
Actor
Всё это актор
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщения актор может
отправить конечное число сообщений другим акторам
создать конечное число новых акторов
назначить поведение для обработки следующего
сообщения
Порядок доставки сообщений не специфицирован
Акторы имеют «адреса»
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 9 / 73
Actor Model Concurrency vs Parallelism
Concurrency vs Parallelism
Actor Model не о Parallelism, а о Concurrency2
Concurrency
Способность выполняться параллельно.
Parallelism
Действительно параллельное выполнение.
2
Rob Pike. Concurrency is not Parallelism:
https://player.vimeo.com/video/49718712
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 10 / 73
Actor Model Реализации
Реализации
Языки3
с «родной» поддержкой:
Erlang
Scala
...
Библиотеки для языков:
Scala
Java
F#
...
3
http://en.wikipedia.org/wiki/Actor_model
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 11 / 73
Actor Model Реализации
Erlang
Joe Armstrong, Ericsson, 1986
Для разработки распределённых,
отказоустойчивых, неостанавливающихся
приложений мягкого реального времени
Поддерживает «горячую» замену кода
Пример — ПО коммутатора Ericsson AXD301
миллион строк кода
доступность 0.999999999 (31 ms/year downtime)
Parallelism vs Concurrency
Поддержка SMP в 2006.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 12 / 73
Actor Model Реализации
Akka
Будем использовать
Akka (Scala API).
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 13 / 73
Actor Model Наш опыт
Класс систем
Яндекс.Авто
Яндекс.Недвижимость
ETL-процесс:
1 Extract — загрузка внешних данных
2 Transform — унификация, кластеризация, ...
3 Load — построение и раскладка индекса
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 14 / 73
Actor Model Наш опыт
Статистика
Данные:
До 104
источников
До 107
сущностей
20% обновляется ежедневно
2x рост за год
Пользователи4
:
Яндекс.Авто — 4.5 млн. чел.
Яндекс.Недвижимость — 2 млн. чел.
4
http://stat.yandex.ru
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 15 / 73
Actor Model Akka
О проекте
Jonas Bon´er:
Java Champion
Terracotta JVM clustering, JRockit JVM,
AspectWerkz AOP, Eclipse AspectJ
Ресурсы:
http://akka.io/docs/
http://letitcrash.com/
Код:
https://github.com/akka/akka
Apache V2 license
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 16 / 73
Actor Model Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT5
:
1M mps vs 2.1M mps
Akka 2.06
:
50M mps
48-core, 128 GB, ForkJoinPool
5
http://letitcrash.com/post/14783691760/akka-vs-erlang
6
http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 17 / 73
Actor Model Akka
Особенности реализации
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, стратегия супервизора
Множество акторов на множестве нитей
Нет гарантированной доставки, семантика
at-most-once, порядок сохраняется
Сообщения обрабатываются строго по порядку
Иерархия: создаваемые акторы — дети,
родитель — супервизор
Актор скрыт за переносимой ActorRef
Подход «Let it crash»
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 18 / 73
Actor Model Akka
Ссылки
Чисто локальные
Локальные ссылки
Ссылки для маршрутизации (Router)
Ссылки на удалённых акторов
Особые: PromiseActorRef, DeadLetterActorRef,
EmptyLocalActorRef (DeadLetterActorRef)
Примеры путей
akka://system/user/service/worker
akka://system@server.yandex.ru:2552/user/service
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 19 / 73
Actor Model Akka
Конструирование ссылок
Создание акторов: ActorSystem.actorOf или
ActorContext.actorOf
Поиск акторов: ActorSystem.actorFor или
ActorContext.actorFor
Каждый актор знает себя, родителя и детей
Можно делать так:
1 context.actorFor("../brother") ! msg
2 context.actorFor("/user/service") ! msg
3 context.actorSelection("../*") ! msg
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 20 / 73
Actor Model Akka
Именование в локальной системе
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 21 / 73
Actor Model Akka
Пути
Типы путей:
Логический
Физический
Особые пути:
/user
/system
/deadLetters
/temp
/remote
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 22 / 73
Actor Model Akka
Удалённое развёртывание
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 23 / 73
Actor Model Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Нет разделяемому состоянию
«Опасные» подзадачи в дочерние акторы
События жизненного цикла
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 24 / 73
Actor Model Akka
Основные фичи
Actors
Logging
Scheduler
Dispatchers
Routing
Remoting
Serialization
Testing
FSM
Fault Tolerance
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 25 / 73
Actor Model Akka
Дополнительные фичи
Typed Actors
Event Bus
Futures
Dataflow Concurrency
STM
Agents
Transactors
Durable Mailboxes (file, Redis, ZooKeeper, Mongo)
Akka Cluster
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 26 / 73
Actor Model Практические примеры
Определение актора
1 class Partitioner(partitionStorage: ActorRef) extends Actor {
2
3 lazy val log = Logging(context.system, this)
4
5 def receive = {
6 case PartitionFeed(partner, offers) =>
7 partition(partner, offers)
8 case msg =>
9 log.error("Unsupported message received: {}", msg)
10 }
11
12 def partition(partner: Partner, offers: Traversable[Offer]) {
13 ...
14
15 partitionStorage ! UpdatePartitions(partner, partitioning)
16 }
17 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 27 / 73
Actor Model Практические примеры
Создание актора
1 val system = ActorSystem("sharder")
2
3 val partitionStorage = ...
4
5 val partitioner = system.actorOf(Props(
6 new Partitioner(
7 partitionStorage
8 )).withDispatcher("dispatcher.cpu")
9 .withRouter(FromConfig()),
10 "partitioner")
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 28 / 73
Actor Model Практические примеры
Конфигурация диспетчера
Конфигурация в HOCON7
:
1 dispatcher {
2 cpu {
3 type = Dispatcher
4 executor = "fork-join-executor"
5 mailbox-capacity = 4
6 mailbox-push-timeout-time = 5m
7
8 fork-join-executor {
9 parallelism-min = 4
10 parallelism-factor = 1.0
11 }
12 }
13 }
7
Human-Optimized Config Object Notation:
https://github.com/typesafehub/config
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 29 / 73
Actor Model Практические примеры
Диспетчеры и ящики
Диспетчеры:
Dispatcher
PinnedDispatcher
BalancingDispatcher
CallingThreadDispatcher
Почтовые ящики:
UnboundedMailbox
BoundedMailbox
UnboundedPriorityMailbox
BoundedPriorityMailbox
Durable Mailboxes
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 30 / 73
Actor Model Практические примеры
Конфигурация маршрутизатора
1 akka.actor.deployment {
2 /partitioner {
3 router = smallest-mailbox
4 nr-of-instances = 4
5 }
6 }
1 akka.actor.deployment {
2 /unifier {
3 router = round-robin
4 resizer {
5 lower-bound = 2
6 upper-bound = 16
7 }
8 }
9 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 31 / 73
Actor Model Практические примеры
Маршрутизаторы
RoundRobinRouter
RandomRouter
SmallestMailboxRouter
BroadcastRouter
ScatterGatherFirstCompletedRouter
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 32 / 73
Actor Model Практические примеры
Конфигурирование из кода
1 val shardActors =
2 shards.map(system.actorFor(_)).toIndexedSeq
3
4 val shard = system.actorOf(
5 Props[PartitionReceiver]
6 .withRouter(RoundRobinRouter(shardActors))
7 .withDispatcher("dispatcher.shard"),
8 "shard")
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 33 / 73
Actor Model Практические примеры
Распределённые акторы
1 akka {
2 actor {
3 provider = "akka.remote.RemoteActorRefProvider"
4 }
5
6 remote {
7 transport = "akka.remote.netty.NettyRemoteTransport"
8
9 netty {
10 hostname = "server.yandex.ru"
11 port = 2553
12 }
13 }
14 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 34 / 73
Actor Model Практические примеры
Пример теста
1 val probe = TestProbe()
2 val burstScaler = TestActorRef(new BurstScaler(probe.ref))
3
4 before {
5 burstScaler.underlyingActor.sent =
6 burstScaler.underlyingActor.sent.empty
7 }
8
9 "A BurstScaler" should {
10 "always forward the first message" in {
11 probe.within(1 second) {
12 burstScaler ! 1
13 probe.expectMsg(1)
14 }
15 }
16 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 35 / 73
Actor Model Практические примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с Probe
Проверки с сопоставлением по шаблону
Замедление времени
Детализированные логи akka.actor.debug.*
CallingThreadDispatcher
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 36 / 73
Actor Model Практические примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) действует рекурсивно
Функция Exception ⇒ Directive
Terminated, preStart, preRestart, postStop,
postRestart
OneForOneStrategy и AllForOneStrategy
Ограничение количества перезапусков
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 37 / 73
Actor Model Практические примеры
Супервизор по умолчанию
1 final val defaultStrategy: SupervisorStrategy = {
2 def defaultDecider: Decider = {
3 case _: ActorInitializationException => Stop
4 case _: ActorKilledException => Stop
5 case _: Exception => Restart
6 case _ => Escalate
7 }
8 OneForOneStrategy()(defaultDecider)
9 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 38 / 73
Actor Model Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Пишите асинхронный код
Избегайте косвенного взаимодействия акторов
Баги есть, но быстро чинят
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 39 / 73
Actor Model Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные deadlock’и
при наличии циклов
⇒ стройте системы без циклов
Существует диспетчер по умолчанию
Нет доступа к размеру ящика8
8
http:
//letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 40 / 73
Actor Model Alan Kay on OOP, 1967
Alan Kay on OOP, 1967
I thought of objects being like biological cells and/or
individual computers on a network, only able to
communicate with messages (so messaging came at the
very beginning – it took a while to see how to do
messaging in a programming language efficiently enough
to be useful).
OOP to me means only messaging, local retention and
protection and hiding of state-process, and extreme
late-binding of all things. It can be done in Smalltalk and
in LISP. There are possibly other systems in which this is
possible, but I’m not aware of them.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 41 / 73
Futures and Promises
Futures and Promises
David Ross
So a Promise can be broken, but you can’t change the
Future. Love the metaphors.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 42 / 73
Futures and Promises Происхождение
Происхождение
Henry Baker and Carl Hewitt. The Incremental
Garbage Collection of Processes9
. 1977.
Future
Структура данных для синхронного
(блокирующегося) или асинхронного
(неблокирующегося) извлечения результата
параллельной операции.
9
http://en.wikipedia.org/wiki/Futures_and_promises
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 43 / 73
Futures and Promises Реализации
Реализации
Java (java.util.concurrent.Future)
Scala
C#
Python
Haskell
Clojure
Oz
R
Scheme
Node.js
Akka
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 44 / 73
Futures and Promises Аkka Futures
Futures and Actors
Общение с акторами вне Actor System:
1 implicit val timeout = Timeout(5 seconds)
2
3 val future = actor ? msg
4 val result =
5 Await.result(future, timeout.duration)
6 .asInstanceOf[String]
Или так:
1 val future: Future[String] = ask(actor, msg).mapTo[String]
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 45 / 73
Futures and Promises Аkka Futures
Прямое использование
1 val future = Future {
2 "Hello" + "World"
3 }
4 val result = Await.result(future, 1 second)
1 val future = Promise.successful("Yay!")
1 val otherFuture =
2 Promise.failed[String](
3 new IllegalArgumentException("Bang!"))
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 46 / 73
Futures and Promises Аkka Futures
Future — это монада: map (1)
1 val f1 = Future {
2 "Hello" + "World"
3 }
4
5 val f2 = f1 map { x =>
6 x.length
7 }
8
9 val result = Await.result(f2, 1 second)
10
11 result must be(10)
12
13 f1.value must be(Some(Right("HelloWorld")))
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 47 / 73
Futures and Promises Аkka Futures
Future — это монада: map (2)
1 val f1 = Future {
2 "Hello" + "World"
3 }
4 val f2 = Promise.successful(3)
5 val f3 = f1 map { x =>
6 f2 map { y =>
7 x.length * y
8 }
9 }
Тип f3?
Future[Future[Int]]
А хотели: Future[Int]
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 48 / 73
Futures and Promises Аkka Futures
Future — это монада: flatMap
1 val f1 = Future {
2 "Hello" + "World"
3 }
4 val f2 = Promise.successful(3)
5 val f3 = f1 flatMap { x =>
6 f2 map { y =>
7 x.length * y
8 }
9 }
10
11 val result = Await.result(f3, 1 second)
12
13 result must be(30)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 49 / 73
Futures and Promises Аkka Futures
Future — это монада: filter
1 val future1 = Promise.successful(4)
2 val future2 = future1.filter(_ % 2 == 0)
3 val result = Await.result(future2, 1 second)
4 result must be(4)
5
6 val failedFilter = future1.filter(_ % 2 == 1).recover {
7 case m: MatchError => 0
8 }
9
10 val result2 = Await.result(failedFilter, 1 second)
11 result2 must be(0)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 50 / 73
Futures and Promises Аkka Futures
Futures: композиция (1)
1 val f1 = ask(actor1, msg1)
2 val f2 = ask(actor2, msg2)
3
4 val a = Await.result(f1, 1 second).asInstanceOf[Int]
5 val b = Await.result(f2, 1 second).asInstanceOf[Int]
6
7 val f3 = ask(actor3, (a + b))
8
9 val result = Await.result(f3, 1 second).asInstanceOf[Int]
Блокировки
Каждый вызов Await.result() — блокировка.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 51 / 73
Futures and Promises Аkka Futures
Futures: композиция (2)
1 val f1 = ask(actor1, msg1)
2 val f2 = ask(actor2, msg2)
3
4 val f3 = for {
5 a <= f1.mapTo[Int]
6 b <= f2.mapTo[Int]
7 c <= ask(actor3, (a + b)).mapTo[Int]
8 } yield c
9
10 val result = Await.result(f3, 1 second).asInstanceOf[Int]
Блокировки
Уже лучше, но усложняется с ростом числа акторов.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 52 / 73
Futures and Promises Аkka Futures
Futures: композиция (3)
1 Future.sequence:
2 M[Future[A]] => Future[M[A]]
1 Future.traverse:
2 M[A] => (A => Future[B]) => Future[M[B]]
1 Future.fold:
2 Traversable[Future[T]] => R => ((R, T) => R) => Future[R]
1 Future.reduce[T, R >: T]:
2 Traversable[Future[T]] => ((R, T) => R) => Future[R]
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 53 / 73
Futures and Promises Аkka Futures
Futures: Callbacks
1 future onSuccess {
2 case "bar" => println("Got my bar alright!")
3 case x: String => println("Got some random string: " + x)
4 }
1 future onFailure {
2 case ise: IllegalStateException
3 if ise.getMessage == "OHNOES" =>
4 // OHNOES! We are in deep trouble, do something!
5 case e: Exception =>
6 // Do something else
7 }
1 future onComplete {
2 case Right(result) => doSomethingOnSuccess(result)
3 case Left(failure) => doSomethingOnFailure(failure)
4 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 54 / 73
Futures and Promises Аkka Futures
Futures: Порядок Callback’ов
Исполнение Callback’ов
Обработчики исполняются в неопределенном
порядке и/или параллельно.
1 val result = Future { loadPage(url) } andThen {
2 case Left(exception) => log(exception)
3 } andThen {
4 case _ => watchSomeTV
5 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 55 / 73
Futures and Promises Аkka Futures
Futures: Полезности
Future.fallbackTo():
1 val future4 = future1 fallbackTo future2 fallbackTo future3
Future.zip():
1 val future3 =
2 future1 zip future2 map { case (a, b) => a + " " + b }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 56 / 73
Futures and Promises Аkka Futures
Futures and Exceptions
Исключения доставляются вместо результата Future.
Но можно делать так:
1 val future = akka.pattern.ask(actor, msg1) recover {
2 case e: ArithmeticException => 0
3 }
Или так:
1 val future = akka.pattern.ask(actor, msg1) recoverWith {
2 case e: ArithmeticException =>
3 Promise.successful(0)
4 case foo: IllegalArgumentException =>
5 Promise.failed[Int](
6 new IllegalStateException("All br0ken!"))
7 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 57 / 73
Dataflow Concurrency Ссылки
Ссылки
Peter Van Roy and Seif Haridi. Concepts, Techniques
and Models of Computer Programming10
.
10
http://www.info.ucl.ac.be/~pvr/book.html
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 58 / 73
Dataflow Concurrency Реализация в Akka
Реализация в Akka
В стиле языка Oz11
Декларативное описание
Ленивое вычисление «по требованию»
Базируется на Futures
Вычисление детерминировано
Нет разницы между последовательным и
параллельным кодом
Использует Scala Delimited Continuations
11
http://www.mozart-oz.org/documentation/tutorial/node8.html#
chapter.concurrency
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 59 / 73
Dataflow Concurrency Ограничения
Ограничения
Код должен быть без побочных эффектов —
только «чистые» функции
Подход не общего назначения
Подходит для четко определенных изолированных
модулей
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 60 / 73
Dataflow Concurrency Примитивы
Примитивы
Создание переменной потока данных
Ожидание «связывания» переменной
Связывание переменной
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 61 / 73
Dataflow Concurrency Примеры
Dataflow Delimiter (1)
1 import Future.flow
2
3 implicit val dispatcher = ...
4
5 val a = Future( ... )
6 val b = Future( ... )
7 val c = Promise[Int]()
8
9 flow {
10 c << (a() + b())
11 }
12
13 val result = Await.result(c, timeout)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 62 / 73
Dataflow Concurrency Примеры
Dataflow Delimiter (2)
1 import Future.flow
2
3 implicit val dispatcher = ...
4
5 val a = Future( ... )
6 val b = Future( ... )
7
8 val c = flow {
9 a() + b()
10 }
11
12 val result = Await.result(c, timeout)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 63 / 73
Dataflow Concurrency Примеры
Пример
1 import akka.dispatch._
2 import Future.flow
3
4 implicit val dispatcher = ...
5
6 val x, y, z = Promise[Int]()
7
8 flow {
9 z << x() + y()
10 println("z = " + z())
11 }
12
13 flow { x << 40 }
14
15 flow { y << 2 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 64 / 73
Software Transactional Memory Происхождение
Происхождение
Tom Knight. An Architecture for Mostly Functional
Languages. 1986.
Maurice Herlihy and J. Eliot B. Moss. Transactional
Memory: Architectural Support for Lock-free Data
Structures. 1993.
Nir Shavit and Dan Touitou. Software Transactional
Memory. 1997.
Вначале как идея аппаратной поддержки
транзакций
В дальнейшем развитие в сторону чисто
программной транзакционной памяти
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 65 / 73
Software Transactional Memory Идея
Идея
Взгляд на память (Java Heap) как на
транзакционный набор данных
Похоже на БД: begin, commit, abort/rollback
Транзакции автоматически
перезапускаются при коллизиях
rollback при ошибках
Свойства ACI (из ACID)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 66 / 73
Software Transactional Memory Реализации
Реализации
Clojure STM12
Akka — войдет в SDK Scala
Haskell
etc
Ссылки:
Rich Hickey. Persistent Data Structures and Managed
References13
12
http://clojure.org/state
13
http:
//www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 67 / 73
Software Transactional Memory Свойства
Свойства
Достоинства
Транзакции могут быть вложенными.
Недостатки
Все операции в области действия транзакции должны
быть идемпотентными и не иметь побочных
эффектов.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 68 / 73
Software Transactional Memory Примеры
Akka Transactional Agents
1 def transfer(from: Agent[Int], to: Agent[Int], amount: Int):
Boolean = {
2 atomic { txn =>
3 if (from.get < amount) false
4 else {
5 from send (_ - amount)
6 to send (_ + amount)
7 true
8 }
9 }
10 }
11
12 val from = Agent(100)
13 val to = Agent(20)
14 val ok = transfer(from, to, 50)
15 val fromValue = from.await // -> 50
16 val toValue = to.await // -> 70
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 69 / 73
Software Transactional Memory Потенциальные проблемы
Потенциальные проблемы
Множественные коллизии:
Низкая производительность и большие задержки
Отсутствие прогресса (live locking)
Несправедливость (unfairness)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 70 / 73
Заключение
Заключение
Параллельные программы — это неизбежно
Нужны более простые способы создания
корректных параллельных программных
систем
Низкоуровневый параллелизм — это чрезвычайно
сложно
Но есть альтернативы14
:
Message-Passing Concurrency (Actor Model)
Dataflow Concurrency
Software Transactional Memory (STM)
No Silver Bullet
14
ScalaDays 2013. Concurrency — The good, the bad, the ugly:
http://www.parleys.com/play/51c0bc58e4b0ed877035680a/
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 71 / 73
Заключение Куда двигаться дальше
Куда двигаться дальше
Typesafe Activator15
Reactive Manifesto16
Principles of Reactive Programming17
Книги:
Jamie Allen. Effective Akka. 2013
Derek Wyatt. Akka Concurrency. 2013
Series: The Neophyte’s Guide to Scala18
EAI Patterns Series19
Chris Okasaki. Purely Functional Data Structures. 1999
JCIP 2nd edition + JMM
15
http://typesafe.com/activator
16
http://www.reactivemanifesto.org
17
https://class.coursera.org/reactive-001/class
18
http://letitcrash.com/post/64667109914/
series-the-neophytes-guide-to-scala
19Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 72 / 73
Вопросы?
Вопросы?
http://incubos.org/contacts/
Общие вопросы — в Twitter: @incubos
Вопросы по лекциям — в комментариях:
http://incubos.org/blog/
Частные вопросы — в почту
vadim.tsesko@gmail.com
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 73 / 73

Weitere ähnliche Inhalte

Was ist angesagt?

Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
Alex Chistyakov
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Yulia Tsisyk
 
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch SadogurskySpring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
JavaDayUA
 

Was ist angesagt? (18)

Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Spring the ripper
Spring the ripperSpring the ripper
Spring the ripper
 
Gen server
Gen serverGen server
Gen server
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Ruby
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
Cоздание приложений со знанием Perl
Cоздание приложений со знанием PerlCоздание приложений со знанием Perl
Cоздание приложений со знанием Perl
 
Easy selenium test automation on python
Easy selenium test automation on pythonEasy selenium test automation on python
Easy selenium test automation on python
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0Встречайте Zend Framework 2.0
Встречайте Zend Framework 2.0
 
Spring puzzlers 2
Spring puzzlers 2Spring puzzlers 2
Spring puzzlers 2
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
Автоматизация для ленивых тестировщиков. Selenium + Python + Behave (BDD)
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
Никита Цуканов "Параллелизм и распределённые вычисления на акторах с Akka.net"
 
Скриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПОСкриптовой язык Groovy и его применение в рамках разработки ПО
Скриптовой язык Groovy и его применение в рамках разработки ПО
 
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch SadogurskySpring Puzzlers by Evgeny Borisov, Baruch Sadogursky
Spring Puzzlers by Evgeny Borisov, Baruch Sadogursky
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 

Andere mochten auch

Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
Vadim Tsesko
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
Vadim Tsesko
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
Vadim Tsesko
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
Vadim Tsesko
 
Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
Vadim Tsesko
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
Vadim Tsesko
 

Andere mochten auch (16)

Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
 
Базы данных. HDFS
Базы данных. HDFSБазы данных. HDFS
Базы данных. HDFS
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed Commit
 
Базы данных. Haystack
Базы данных. HaystackБазы данных. Haystack
Базы данных. Haystack
 
Базы данных. MongoDB
Базы данных. MongoDBБазы данных. MongoDB
Базы данных. MongoDB
 
Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. Cassandra
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & Cache
 
Базы данных. Введение
Базы данных. ВведениеБазы данных. Введение
Базы данных. Введение
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
 
Multidimensional indexing
Multidimensional indexingMultidimensional indexing
Multidimensional indexing
 
Actor model
Actor modelActor model
Actor model
 
Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
 
Базы данных. ZooKeeper
Базы данных. ZooKeeperБазы данных. ZooKeeper
Базы данных. ZooKeeper
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
 
YoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.ВертикаляхYoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.Вертикалях
 

Kürzlich hochgeladen

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 

Kürzlich hochgeladen (9)

Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 

Actor model

  • 1. Actor Model Курс «Параллельные вычисления» Цесько Вадим Александрович http://kspt.ftk.spbstu.ru/people/tsesko/ @incubos Санкт-Петербургский государственный политехнический университет 29 ноября 2013 г. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 1 / 73
  • 2. Содержание 1 Введение 2 Actor Model 3 Futures and Promises 4 Dataflow Concurrency 5 Software Transactional Memory 6 Заключение Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 2 / 73
  • 3. Введение Обо мне Обо мне 5 лет в Digitek Labs Параллельные системы цифровой обработки сигналов Статический анализ кода программных систем 2.5 года в Яндекс Распределённые высоконагруженные системы Преподавание Базы данных Формальные методы обеспечения качества ПО Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 3 / 73
  • 4. Введение Disclaimer Disclaimer If I had asked people what they wanted, they would have said faster horses. Henry Ford Must Watch Jonas Bon´er. State: You’re Doing It Wrong — Alternative Concurrency Paradigms For The JVMa . JavaOne 2009. a http://www.slideshare.net/jboner/ state-youre-doing-it-wrong-javaone-2009 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 4 / 73
  • 5. Введение Параллельное программирование Параллельное программирование Damien Katz Beginner: "Threads are hard." Intermediate: "Don’t fear multithreading." Expert: "Threads are hard." Тем не менее The free lunch is overa . a Herb Sutter. The Free Lunch Is Over. 2009 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 5 / 73
  • 6. Введение Проблема Проблема Источник боли Разделяемое состояние. А если точнее, то Изменяемое разделяемое состояние. И Часто оно неизбежно. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 6 / 73
  • 7. Введение Классификация задач и подходов Классификация задач и подходов Shared State Concurrency (чугунная пуля) Невероятно сложно Даже для экспертов Координация независимых задач/процессов Планирование, игры Message-Passing Concurrency (Actor Model) Workflow-зависимые процессы Банковская сфера, MapReduce Dataflow Concurrency Консенсус и истинное разделяемое знание Банковская сфера Software Transactional Memory (STM) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 7 / 73
  • 8. Actor Model Происхождение Происхождение Carl Hewitt1 , Peter Bishop and Richard Steiger. A Universal Modular Actor Formalism for Artificial Intelligence. 1973. Gul Agha. Actors: A Model of Concurrent Computation in Distributed Systems. 1986. Изначально для описания параллельных вычислений Позднее в качестве основы для многочисленных реализаций 1 http://letitcrash.com/post/20964174345/ carl-hewitt-explains-the-essence-of-the-actor Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 8 / 73
  • 9. Actor Model Actor Actor Всё это актор Функционируют параллельно Асинхронно обмениваются сообщениями При обработке сообщения актор может отправить конечное число сообщений другим акторам создать конечное число новых акторов назначить поведение для обработки следующего сообщения Порядок доставки сообщений не специфицирован Акторы имеют «адреса» Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 9 / 73
  • 10. Actor Model Concurrency vs Parallelism Concurrency vs Parallelism Actor Model не о Parallelism, а о Concurrency2 Concurrency Способность выполняться параллельно. Parallelism Действительно параллельное выполнение. 2 Rob Pike. Concurrency is not Parallelism: https://player.vimeo.com/video/49718712 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 10 / 73
  • 11. Actor Model Реализации Реализации Языки3 с «родной» поддержкой: Erlang Scala ... Библиотеки для языков: Scala Java F# ... 3 http://en.wikipedia.org/wiki/Actor_model Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 11 / 73
  • 12. Actor Model Реализации Erlang Joe Armstrong, Ericsson, 1986 Для разработки распределённых, отказоустойчивых, неостанавливающихся приложений мягкого реального времени Поддерживает «горячую» замену кода Пример — ПО коммутатора Ericsson AXD301 миллион строк кода доступность 0.999999999 (31 ms/year downtime) Parallelism vs Concurrency Поддержка SMP в 2006. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 12 / 73
  • 13. Actor Model Реализации Akka Будем использовать Akka (Scala API). Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 13 / 73
  • 14. Actor Model Наш опыт Класс систем Яндекс.Авто Яндекс.Недвижимость ETL-процесс: 1 Extract — загрузка внешних данных 2 Transform — унификация, кластеризация, ... 3 Load — построение и раскладка индекса Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 14 / 73
  • 15. Actor Model Наш опыт Статистика Данные: До 104 источников До 107 сущностей 20% обновляется ежедневно 2x рост за год Пользователи4 : Яндекс.Авто — 4.5 млн. чел. Яндекс.Недвижимость — 2 млн. чел. 4 http://stat.yandex.ru Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 15 / 73
  • 16. Actor Model Akka О проекте Jonas Bon´er: Java Champion Terracotta JVM clustering, JRockit JVM, AspectWerkz AOP, Eclipse AspectJ Ресурсы: http://akka.io/docs/ http://letitcrash.com/ Код: https://github.com/akka/akka Apache V2 license Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 16 / 73
  • 17. Actor Model Akka Производительность Внимание Синтетические тесты Erlang R14B04 vs Akka 2.0-SNAPSHOT5 : 1M mps vs 2.1M mps Akka 2.06 : 50M mps 48-core, 128 GB, ForkJoinPool 5 http://letitcrash.com/post/14783691760/akka-vs-erlang 6 http://letitcrash.com/post/20397701710/ 50-million-messages-per-second-on-a-single-machine Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 17 / 73
  • 18. Actor Model Akka Особенности реализации 300 байт на актор Актор: состояние, поведение, почтовый ящик, список детей, стратегия супервизора Множество акторов на множестве нитей Нет гарантированной доставки, семантика at-most-once, порядок сохраняется Сообщения обрабатываются строго по порядку Иерархия: создаваемые акторы — дети, родитель — супервизор Актор скрыт за переносимой ActorRef Подход «Let it crash» Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 18 / 73
  • 19. Actor Model Akka Ссылки Чисто локальные Локальные ссылки Ссылки для маршрутизации (Router) Ссылки на удалённых акторов Особые: PromiseActorRef, DeadLetterActorRef, EmptyLocalActorRef (DeadLetterActorRef) Примеры путей akka://system/user/service/worker akka://system@server.yandex.ru:2552/user/service Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 19 / 73
  • 20. Actor Model Akka Конструирование ссылок Создание акторов: ActorSystem.actorOf или ActorContext.actorOf Поиск акторов: ActorSystem.actorFor или ActorContext.actorFor Каждый актор знает себя, родителя и детей Можно делать так: 1 context.actorFor("../brother") ! msg 2 context.actorFor("/user/service") ! msg 3 context.actorSelection("../*") ! msg Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 20 / 73
  • 21. Actor Model Akka Именование в локальной системе Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 21 / 73
  • 22. Actor Model Akka Пути Типы путей: Логический Физический Особые пути: /user /system /deadLetters /temp /remote Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 22 / 73
  • 23. Actor Model Akka Удалённое развёртывание Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 23 / 73
  • 24. Actor Model Akka Actor Best Practices Не блокироваться Неизменяемые сообщения Нет разделяемому состоянию «Опасные» подзадачи в дочерние акторы События жизненного цикла Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 24 / 73
  • 25. Actor Model Akka Основные фичи Actors Logging Scheduler Dispatchers Routing Remoting Serialization Testing FSM Fault Tolerance Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 25 / 73
  • 26. Actor Model Akka Дополнительные фичи Typed Actors Event Bus Futures Dataflow Concurrency STM Agents Transactors Durable Mailboxes (file, Redis, ZooKeeper, Mongo) Akka Cluster Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 26 / 73
  • 27. Actor Model Практические примеры Определение актора 1 class Partitioner(partitionStorage: ActorRef) extends Actor { 2 3 lazy val log = Logging(context.system, this) 4 5 def receive = { 6 case PartitionFeed(partner, offers) => 7 partition(partner, offers) 8 case msg => 9 log.error("Unsupported message received: {}", msg) 10 } 11 12 def partition(partner: Partner, offers: Traversable[Offer]) { 13 ... 14 15 partitionStorage ! UpdatePartitions(partner, partitioning) 16 } 17 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 27 / 73
  • 28. Actor Model Практические примеры Создание актора 1 val system = ActorSystem("sharder") 2 3 val partitionStorage = ... 4 5 val partitioner = system.actorOf(Props( 6 new Partitioner( 7 partitionStorage 8 )).withDispatcher("dispatcher.cpu") 9 .withRouter(FromConfig()), 10 "partitioner") Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 28 / 73
  • 29. Actor Model Практические примеры Конфигурация диспетчера Конфигурация в HOCON7 : 1 dispatcher { 2 cpu { 3 type = Dispatcher 4 executor = "fork-join-executor" 5 mailbox-capacity = 4 6 mailbox-push-timeout-time = 5m 7 8 fork-join-executor { 9 parallelism-min = 4 10 parallelism-factor = 1.0 11 } 12 } 13 } 7 Human-Optimized Config Object Notation: https://github.com/typesafehub/config Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 29 / 73
  • 30. Actor Model Практические примеры Диспетчеры и ящики Диспетчеры: Dispatcher PinnedDispatcher BalancingDispatcher CallingThreadDispatcher Почтовые ящики: UnboundedMailbox BoundedMailbox UnboundedPriorityMailbox BoundedPriorityMailbox Durable Mailboxes Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 30 / 73
  • 31. Actor Model Практические примеры Конфигурация маршрутизатора 1 akka.actor.deployment { 2 /partitioner { 3 router = smallest-mailbox 4 nr-of-instances = 4 5 } 6 } 1 akka.actor.deployment { 2 /unifier { 3 router = round-robin 4 resizer { 5 lower-bound = 2 6 upper-bound = 16 7 } 8 } 9 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 31 / 73
  • 32. Actor Model Практические примеры Маршрутизаторы RoundRobinRouter RandomRouter SmallestMailboxRouter BroadcastRouter ScatterGatherFirstCompletedRouter Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 32 / 73
  • 33. Actor Model Практические примеры Конфигурирование из кода 1 val shardActors = 2 shards.map(system.actorFor(_)).toIndexedSeq 3 4 val shard = system.actorOf( 5 Props[PartitionReceiver] 6 .withRouter(RoundRobinRouter(shardActors)) 7 .withDispatcher("dispatcher.shard"), 8 "shard") Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 33 / 73
  • 34. Actor Model Практические примеры Распределённые акторы 1 akka { 2 actor { 3 provider = "akka.remote.RemoteActorRefProvider" 4 } 5 6 remote { 7 transport = "akka.remote.netty.NettyRemoteTransport" 8 9 netty { 10 hostname = "server.yandex.ru" 11 port = 2553 12 } 13 } 14 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 34 / 73
  • 35. Actor Model Практические примеры Пример теста 1 val probe = TestProbe() 2 val burstScaler = TestActorRef(new BurstScaler(probe.ref)) 3 4 before { 5 burstScaler.underlyingActor.sent = 6 burstScaler.underlyingActor.sent.empty 7 } 8 9 "A BurstScaler" should { 10 "always forward the first message" in { 11 probe.within(1 second) { 12 burstScaler ! 1 13 probe.expectMsg(1) 14 } 15 } 16 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 35 / 73
  • 36. Actor Model Практические примеры Тестирование акторов Модульное тестирование с TestActorRef Интеграционное тестирование с Probe Проверки с сопоставлением по шаблону Замедление времени Детализированные логи akka.actor.debug.* CallingThreadDispatcher Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 36 / 73
  • 37. Actor Model Практические примеры Супервизор Решение при сбое: 1 Resume 2 Restart 3 Stop 4 Escalate Принятое решение (1-3) действует рекурсивно Функция Exception ⇒ Directive Terminated, preStart, preRestart, postStop, postRestart OneForOneStrategy и AllForOneStrategy Ограничение количества перезапусков Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 37 / 73
  • 38. Actor Model Практические примеры Супервизор по умолчанию 1 final val defaultStrategy: SupervisorStrategy = { 2 def defaultDecider: Decider = { 3 case _: ActorInitializationException => Stop 4 case _: ActorKilledException => Stop 5 case _: Exception => Restart 6 case _ => Escalate 7 } 8 OneForOneStrategy()(defaultDecider) 9 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 38 / 73
  • 39. Actor Model Опыт Акторы Храните состояние вовне Стройте всю систему на акторах Пишите асинхронный код Избегайте косвенного взаимодействия акторов Баги есть, но быстро чинят Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 39 / 73
  • 40. Actor Model Опыт Память и ящики Неограниченные ящики ⇒ неограниченная память при перегрузке Ограниченные ящики ⇒ возможные deadlock’и при наличии циклов ⇒ стройте системы без циклов Существует диспетчер по умолчанию Нет доступа к размеру ящика8 8 http: //letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 40 / 73
  • 41. Actor Model Alan Kay on OOP, 1967 Alan Kay on OOP, 1967 I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful). OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I’m not aware of them. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 41 / 73
  • 42. Futures and Promises Futures and Promises David Ross So a Promise can be broken, but you can’t change the Future. Love the metaphors. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 42 / 73
  • 43. Futures and Promises Происхождение Происхождение Henry Baker and Carl Hewitt. The Incremental Garbage Collection of Processes9 . 1977. Future Структура данных для синхронного (блокирующегося) или асинхронного (неблокирующегося) извлечения результата параллельной операции. 9 http://en.wikipedia.org/wiki/Futures_and_promises Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 43 / 73
  • 44. Futures and Promises Реализации Реализации Java (java.util.concurrent.Future) Scala C# Python Haskell Clojure Oz R Scheme Node.js Akka Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 44 / 73
  • 45. Futures and Promises Аkka Futures Futures and Actors Общение с акторами вне Actor System: 1 implicit val timeout = Timeout(5 seconds) 2 3 val future = actor ? msg 4 val result = 5 Await.result(future, timeout.duration) 6 .asInstanceOf[String] Или так: 1 val future: Future[String] = ask(actor, msg).mapTo[String] Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 45 / 73
  • 46. Futures and Promises Аkka Futures Прямое использование 1 val future = Future { 2 "Hello" + "World" 3 } 4 val result = Await.result(future, 1 second) 1 val future = Promise.successful("Yay!") 1 val otherFuture = 2 Promise.failed[String]( 3 new IllegalArgumentException("Bang!")) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 46 / 73
  • 47. Futures and Promises Аkka Futures Future — это монада: map (1) 1 val f1 = Future { 2 "Hello" + "World" 3 } 4 5 val f2 = f1 map { x => 6 x.length 7 } 8 9 val result = Await.result(f2, 1 second) 10 11 result must be(10) 12 13 f1.value must be(Some(Right("HelloWorld"))) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 47 / 73
  • 48. Futures and Promises Аkka Futures Future — это монада: map (2) 1 val f1 = Future { 2 "Hello" + "World" 3 } 4 val f2 = Promise.successful(3) 5 val f3 = f1 map { x => 6 f2 map { y => 7 x.length * y 8 } 9 } Тип f3? Future[Future[Int]] А хотели: Future[Int] Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 48 / 73
  • 49. Futures and Promises Аkka Futures Future — это монада: flatMap 1 val f1 = Future { 2 "Hello" + "World" 3 } 4 val f2 = Promise.successful(3) 5 val f3 = f1 flatMap { x => 6 f2 map { y => 7 x.length * y 8 } 9 } 10 11 val result = Await.result(f3, 1 second) 12 13 result must be(30) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 49 / 73
  • 50. Futures and Promises Аkka Futures Future — это монада: filter 1 val future1 = Promise.successful(4) 2 val future2 = future1.filter(_ % 2 == 0) 3 val result = Await.result(future2, 1 second) 4 result must be(4) 5 6 val failedFilter = future1.filter(_ % 2 == 1).recover { 7 case m: MatchError => 0 8 } 9 10 val result2 = Await.result(failedFilter, 1 second) 11 result2 must be(0) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 50 / 73
  • 51. Futures and Promises Аkka Futures Futures: композиция (1) 1 val f1 = ask(actor1, msg1) 2 val f2 = ask(actor2, msg2) 3 4 val a = Await.result(f1, 1 second).asInstanceOf[Int] 5 val b = Await.result(f2, 1 second).asInstanceOf[Int] 6 7 val f3 = ask(actor3, (a + b)) 8 9 val result = Await.result(f3, 1 second).asInstanceOf[Int] Блокировки Каждый вызов Await.result() — блокировка. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 51 / 73
  • 52. Futures and Promises Аkka Futures Futures: композиция (2) 1 val f1 = ask(actor1, msg1) 2 val f2 = ask(actor2, msg2) 3 4 val f3 = for { 5 a <= f1.mapTo[Int] 6 b <= f2.mapTo[Int] 7 c <= ask(actor3, (a + b)).mapTo[Int] 8 } yield c 9 10 val result = Await.result(f3, 1 second).asInstanceOf[Int] Блокировки Уже лучше, но усложняется с ростом числа акторов. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 52 / 73
  • 53. Futures and Promises Аkka Futures Futures: композиция (3) 1 Future.sequence: 2 M[Future[A]] => Future[M[A]] 1 Future.traverse: 2 M[A] => (A => Future[B]) => Future[M[B]] 1 Future.fold: 2 Traversable[Future[T]] => R => ((R, T) => R) => Future[R] 1 Future.reduce[T, R >: T]: 2 Traversable[Future[T]] => ((R, T) => R) => Future[R] Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 53 / 73
  • 54. Futures and Promises Аkka Futures Futures: Callbacks 1 future onSuccess { 2 case "bar" => println("Got my bar alright!") 3 case x: String => println("Got some random string: " + x) 4 } 1 future onFailure { 2 case ise: IllegalStateException 3 if ise.getMessage == "OHNOES" => 4 // OHNOES! We are in deep trouble, do something! 5 case e: Exception => 6 // Do something else 7 } 1 future onComplete { 2 case Right(result) => doSomethingOnSuccess(result) 3 case Left(failure) => doSomethingOnFailure(failure) 4 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 54 / 73
  • 55. Futures and Promises Аkka Futures Futures: Порядок Callback’ов Исполнение Callback’ов Обработчики исполняются в неопределенном порядке и/или параллельно. 1 val result = Future { loadPage(url) } andThen { 2 case Left(exception) => log(exception) 3 } andThen { 4 case _ => watchSomeTV 5 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 55 / 73
  • 56. Futures and Promises Аkka Futures Futures: Полезности Future.fallbackTo(): 1 val future4 = future1 fallbackTo future2 fallbackTo future3 Future.zip(): 1 val future3 = 2 future1 zip future2 map { case (a, b) => a + " " + b } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 56 / 73
  • 57. Futures and Promises Аkka Futures Futures and Exceptions Исключения доставляются вместо результата Future. Но можно делать так: 1 val future = akka.pattern.ask(actor, msg1) recover { 2 case e: ArithmeticException => 0 3 } Или так: 1 val future = akka.pattern.ask(actor, msg1) recoverWith { 2 case e: ArithmeticException => 3 Promise.successful(0) 4 case foo: IllegalArgumentException => 5 Promise.failed[Int]( 6 new IllegalStateException("All br0ken!")) 7 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 57 / 73
  • 58. Dataflow Concurrency Ссылки Ссылки Peter Van Roy and Seif Haridi. Concepts, Techniques and Models of Computer Programming10 . 10 http://www.info.ucl.ac.be/~pvr/book.html Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 58 / 73
  • 59. Dataflow Concurrency Реализация в Akka Реализация в Akka В стиле языка Oz11 Декларативное описание Ленивое вычисление «по требованию» Базируется на Futures Вычисление детерминировано Нет разницы между последовательным и параллельным кодом Использует Scala Delimited Continuations 11 http://www.mozart-oz.org/documentation/tutorial/node8.html# chapter.concurrency Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 59 / 73
  • 60. Dataflow Concurrency Ограничения Ограничения Код должен быть без побочных эффектов — только «чистые» функции Подход не общего назначения Подходит для четко определенных изолированных модулей Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 60 / 73
  • 61. Dataflow Concurrency Примитивы Примитивы Создание переменной потока данных Ожидание «связывания» переменной Связывание переменной Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 61 / 73
  • 62. Dataflow Concurrency Примеры Dataflow Delimiter (1) 1 import Future.flow 2 3 implicit val dispatcher = ... 4 5 val a = Future( ... ) 6 val b = Future( ... ) 7 val c = Promise[Int]() 8 9 flow { 10 c << (a() + b()) 11 } 12 13 val result = Await.result(c, timeout) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 62 / 73
  • 63. Dataflow Concurrency Примеры Dataflow Delimiter (2) 1 import Future.flow 2 3 implicit val dispatcher = ... 4 5 val a = Future( ... ) 6 val b = Future( ... ) 7 8 val c = flow { 9 a() + b() 10 } 11 12 val result = Await.result(c, timeout) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 63 / 73
  • 64. Dataflow Concurrency Примеры Пример 1 import akka.dispatch._ 2 import Future.flow 3 4 implicit val dispatcher = ... 5 6 val x, y, z = Promise[Int]() 7 8 flow { 9 z << x() + y() 10 println("z = " + z()) 11 } 12 13 flow { x << 40 } 14 15 flow { y << 2 } Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 64 / 73
  • 65. Software Transactional Memory Происхождение Происхождение Tom Knight. An Architecture for Mostly Functional Languages. 1986. Maurice Herlihy and J. Eliot B. Moss. Transactional Memory: Architectural Support for Lock-free Data Structures. 1993. Nir Shavit and Dan Touitou. Software Transactional Memory. 1997. Вначале как идея аппаратной поддержки транзакций В дальнейшем развитие в сторону чисто программной транзакционной памяти Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 65 / 73
  • 66. Software Transactional Memory Идея Идея Взгляд на память (Java Heap) как на транзакционный набор данных Похоже на БД: begin, commit, abort/rollback Транзакции автоматически перезапускаются при коллизиях rollback при ошибках Свойства ACI (из ACID) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 66 / 73
  • 67. Software Transactional Memory Реализации Реализации Clojure STM12 Akka — войдет в SDK Scala Haskell etc Ссылки: Rich Hickey. Persistent Data Structures and Managed References13 12 http://clojure.org/state 13 http: //www.infoq.com/presentations/Value-Identity-State-Rich-Hickey Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 67 / 73
  • 68. Software Transactional Memory Свойства Свойства Достоинства Транзакции могут быть вложенными. Недостатки Все операции в области действия транзакции должны быть идемпотентными и не иметь побочных эффектов. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 68 / 73
  • 69. Software Transactional Memory Примеры Akka Transactional Agents 1 def transfer(from: Agent[Int], to: Agent[Int], amount: Int): Boolean = { 2 atomic { txn => 3 if (from.get < amount) false 4 else { 5 from send (_ - amount) 6 to send (_ + amount) 7 true 8 } 9 } 10 } 11 12 val from = Agent(100) 13 val to = Agent(20) 14 val ok = transfer(from, to, 50) 15 val fromValue = from.await // -> 50 16 val toValue = to.await // -> 70 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 69 / 73
  • 70. Software Transactional Memory Потенциальные проблемы Потенциальные проблемы Множественные коллизии: Низкая производительность и большие задержки Отсутствие прогресса (live locking) Несправедливость (unfairness) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 70 / 73
  • 71. Заключение Заключение Параллельные программы — это неизбежно Нужны более простые способы создания корректных параллельных программных систем Низкоуровневый параллелизм — это чрезвычайно сложно Но есть альтернативы14 : Message-Passing Concurrency (Actor Model) Dataflow Concurrency Software Transactional Memory (STM) No Silver Bullet 14 ScalaDays 2013. Concurrency — The good, the bad, the ugly: http://www.parleys.com/play/51c0bc58e4b0ed877035680a/ Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 71 / 73
  • 72. Заключение Куда двигаться дальше Куда двигаться дальше Typesafe Activator15 Reactive Manifesto16 Principles of Reactive Programming17 Книги: Jamie Allen. Effective Akka. 2013 Derek Wyatt. Akka Concurrency. 2013 Series: The Neophyte’s Guide to Scala18 EAI Patterns Series19 Chris Okasaki. Purely Functional Data Structures. 1999 JCIP 2nd edition + JMM 15 http://typesafe.com/activator 16 http://www.reactivemanifesto.org 17 https://class.coursera.org/reactive-001/class 18 http://letitcrash.com/post/64667109914/ series-the-neophytes-guide-to-scala 19Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 72 / 73
  • 73. Вопросы? Вопросы? http://incubos.org/contacts/ Общие вопросы — в Twitter: @incubos Вопросы по лекциям — в комментариях: http://incubos.org/blog/ Частные вопросы — в почту vadim.tsesko@gmail.com Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 73 / 73