Actor Model
Курс «Параллельные вычисления»
Цесько Вадим Александрович
http://kspt.ftk.spbstu.ru/people/tsesko/
@incubos
Са...
Содержание
1 Введение
2 Actor Model
3 Futures and Promises
4 Dataflow Concurrency
5 Software Transactional Memory
6 Заключе...
Введение Обо мне
Обо мне
5 лет в Digitek Labs
Параллельные системы цифровой обработки
сигналов
Статический анализ кода про...
Введение Disclaimer
Disclaimer
If I had asked people what
they wanted, they would
have said faster horses.
Henry Ford
Must...
Введение Параллельное программирование
Параллельное программирование
Damien Katz
Beginner: "Threads are hard."
Intermediat...
Введение Проблема
Проблема
Источник боли
Разделяемое состояние.
А если точнее, то
Изменяемое разделяемое состояние.
И
Част...
Введение Классификация задач и подходов
Классификация задач и подходов
Shared State Concurrency (чугунная пуля)
Невероятно...
Actor Model Происхождение
Происхождение
Carl Hewitt1
, Peter Bishop and Richard Steiger. A
Universal Modular Actor Formali...
Actor Model Actor
Actor
Всё это актор
Функционируют параллельно
Асинхронно обмениваются сообщениями
При обработке сообщени...
Actor Model Concurrency vs Parallelism
Concurrency vs Parallelism
Actor Model не о Parallelism, а о Concurrency2
Concurren...
Actor Model Реализации
Реализации
Языки3
с «родной» поддержкой:
Erlang
Scala
...
Библиотеки для языков:
Scala
Java
F#
...
...
Actor Model Реализации
Erlang
Joe Armstrong, Ericsson, 1986
Для разработки распределённых,
отказоустойчивых, неостанавлива...
Actor Model Реализации
Akka
Будем использовать
Akka (Scala API).
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 13 / ...
Actor Model Наш опыт
Класс систем
Яндекс.Авто
Яндекс.Недвижимость
ETL-процесс:
1 Extract — загрузка внешних данных
2 Trans...
Actor Model Наш опыт
Статистика
Данные:
До 104
источников
До 107
сущностей
20% обновляется ежедневно
2x рост за год
Пользо...
Actor Model Akka
О проекте
Jonas Bon´er:
Java Champion
Terracotta JVM clustering, JRockit JVM,
AspectWerkz AOP, Eclipse As...
Actor Model Akka
Производительность
Внимание
Синтетические тесты
Erlang R14B04 vs Akka 2.0-SNAPSHOT5
:
1M mps vs 2.1M mps
...
Actor Model Akka
Особенности реализации
300 байт на актор
Актор: состояние, поведение, почтовый ящик,
список детей, страте...
Actor Model Akka
Ссылки
Чисто локальные
Локальные ссылки
Ссылки для маршрутизации (Router)
Ссылки на удалённых акторов
Осо...
Actor Model Akka
Конструирование ссылок
Создание акторов: ActorSystem.actorOf или
ActorContext.actorOf
Поиск акторов: Acto...
Actor Model Akka
Именование в локальной системе
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 21 / 73
Actor Model Akka
Пути
Типы путей:
Логический
Физический
Особые пути:
/user
/system
/deadLetters
/temp
/remote
Цесько В. А....
Actor Model Akka
Удалённое развёртывание
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 23 / 73
Actor Model Akka
Actor Best Practices
Не блокироваться
Неизменяемые сообщения
Нет разделяемому состоянию
«Опасные» подзада...
Actor Model Akka
Основные фичи
Actors
Logging
Scheduler
Dispatchers
Routing
Remoting
Serialization
Testing
FSM
Fault Toler...
Actor Model Akka
Дополнительные фичи
Typed Actors
Event Bus
Futures
Dataflow Concurrency
STM
Agents
Transactors
Durable Mai...
Actor Model Практические примеры
Определение актора
1 class Partitioner(partitionStorage: ActorRef) extends Actor {
2
3 la...
Actor Model Практические примеры
Создание актора
1 val system = ActorSystem("sharder")
2
3 val partitionStorage = ...
4
5 ...
Actor Model Практические примеры
Конфигурация диспетчера
Конфигурация в HOCON7
:
1 dispatcher {
2 cpu {
3 type = Dispatche...
Actor Model Практические примеры
Диспетчеры и ящики
Диспетчеры:
Dispatcher
PinnedDispatcher
BalancingDispatcher
CallingThr...
Actor Model Практические примеры
Конфигурация маршрутизатора
1 akka.actor.deployment {
2 /partitioner {
3 router = smalles...
Actor Model Практические примеры
Маршрутизаторы
RoundRobinRouter
RandomRouter
SmallestMailboxRouter
BroadcastRouter
Scatte...
Actor Model Практические примеры
Конфигурирование из кода
1 val shardActors =
2 shards.map(system.actorFor(_)).toIndexedSe...
Actor Model Практические примеры
Распределённые акторы
1 akka {
2 actor {
3 provider = "akka.remote.RemoteActorRefProvider...
Actor Model Практические примеры
Пример теста
1 val probe = TestProbe()
2 val burstScaler = TestActorRef(new BurstScaler(p...
Actor Model Практические примеры
Тестирование акторов
Модульное тестирование с TestActorRef
Интеграционное тестирование с ...
Actor Model Практические примеры
Супервизор
Решение при сбое:
1 Resume
2 Restart
3 Stop
4 Escalate
Принятое решение (1-3) ...
Actor Model Практические примеры
Супервизор по умолчанию
1 final val defaultStrategy: SupervisorStrategy = {
2 def defaultD...
Actor Model Опыт
Акторы
Храните состояние вовне
Стройте всю систему на акторах
Пишите асинхронный код
Избегайте косвенного...
Actor Model Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная память
при перегрузке
Ограниченные ящики ⇒ возможные...
Actor Model Alan Kay on OOP, 1967
Alan Kay on OOP, 1967
I thought of objects being like biological cells and/or
individual...
Futures and Promises
Futures and Promises
David Ross
So a Promise can be broken, but you can’t change the
Future. Love the...
Futures and Promises Происхождение
Происхождение
Henry Baker and Carl Hewitt. The Incremental
Garbage Collection of Proces...
Futures and Promises Реализации
Реализации
Java (java.util.concurrent.Future)
Scala
C#
Python
Haskell
Clojure
Oz
R
Scheme
...
Futures and Promises Аkka Futures
Futures and Actors
Общение с акторами вне Actor System:
1 implicit val timeout = Timeout...
Futures and Promises Аkka Futures
Прямое использование
1 val future = Future {
2 "Hello" + "World"
3 }
4 val result = Awai...
Futures and Promises Аkka Futures
Future — это монада: map (1)
1 val f1 = Future {
2 "Hello" + "World"
3 }
4
5 val f2 = f1...
Futures and Promises Аkka Futures
Future — это монада: map (2)
1 val f1 = Future {
2 "Hello" + "World"
3 }
4 val f2 = Prom...
Futures and Promises Аkka Futures
Future — это монада: flatMap
1 val f1 = Future {
2 "Hello" + "World"
3 }
4 val f2 = Prom...
Futures and Promises Аkka Futures
Future — это монада: filter
1 val future1 = Promise.successful(4)
2 val future2 = future...
Futures and Promises Аkka Futures
Futures: композиция (1)
1 val f1 = ask(actor1, msg1)
2 val f2 = ask(actor2, msg2)
3
4 va...
Futures and Promises Аkka Futures
Futures: композиция (2)
1 val f1 = ask(actor1, msg1)
2 val f2 = ask(actor2, msg2)
3
4 va...
Futures and Promises Аkka Futures
Futures: композиция (3)
1 Future.sequence:
2 M[Future[A]] => Future[M[A]]
1 Future.trave...
Futures and Promises Аkka Futures
Futures: Callbacks
1 future onSuccess {
2 case "bar" => println("Got my bar alright!")
3...
Futures and Promises Аkka Futures
Futures: Порядок Callback’ов
Исполнение Callback’ов
Обработчики исполняются в неопределе...
Futures and Promises Аkka Futures
Futures: Полезности
Future.fallbackTo():
1 val future4 = future1 fallbackTo future2 fall...
Futures and Promises Аkka Futures
Futures and Exceptions
Исключения доставляются вместо результата Future.
Но можно делать...
Dataflow Concurrency Ссылки
Ссылки
Peter Van Roy and Seif Haridi. Concepts, Techniques
and Models of Computer Programming10...
Dataflow Concurrency Реализация в Akka
Реализация в Akka
В стиле языка Oz11
Декларативное описание
Ленивое вычисление «по т...
Dataflow Concurrency Ограничения
Ограничения
Код должен быть без побочных эффектов —
только «чистые» функции
Подход не обще...
Dataflow Concurrency Примитивы
Примитивы
Создание переменной потока данных
Ожидание «связывания» переменной
Связывание пере...
Dataflow Concurrency Примеры
Dataflow Delimiter (1)
1 import Future.flow
2
3 implicit val dispatcher = ...
4
5 val a = Futur...
Dataflow Concurrency Примеры
Dataflow Delimiter (2)
1 import Future.flow
2
3 implicit val dispatcher = ...
4
5 val a = Futur...
Dataflow Concurrency Примеры
Пример
1 import akka.dispatch._
2 import Future.flow
3
4 implicit val dispatcher = ...
5
6 val...
Software Transactional Memory Происхождение
Происхождение
Tom Knight. An Architecture for Mostly Functional
Languages. 198...
Software Transactional Memory Идея
Идея
Взгляд на память (Java Heap) как на
транзакционный набор данных
Похоже на БД: begi...
Software Transactional Memory Реализации
Реализации
Clojure STM12
Akka — войдет в SDK Scala
Haskell
etc
Ссылки:
Rich Hicke...
Software Transactional Memory Свойства
Свойства
Достоинства
Транзакции могут быть вложенными.
Недостатки
Все операции в об...
Software Transactional Memory Примеры
Akka Transactional Agents
1 def transfer(from: Agent[Int], to: Agent[Int], amount: I...
Software Transactional Memory Потенциальные проблемы
Потенциальные проблемы
Множественные коллизии:
Низкая производительно...
Заключение
Заключение
Параллельные программы — это неизбежно
Нужны более простые способы создания
корректных параллельных ...
Заключение Куда двигаться дальше
Куда двигаться дальше
Typesafe Activator15
Reactive Manifesto16
Principles of Reactive Pr...
Вопросы?
Вопросы?
http://incubos.org/contacts/
Общие вопросы — в Twitter: @incubos
Вопросы по лекциям — в комментариях:
ht...
Upcoming SlideShare
Loading in...5
×

Actor model

973

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
973
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Actor model

  1. 1. Actor Model Курс «Параллельные вычисления» Цесько Вадим Александрович http://kspt.ftk.spbstu.ru/people/tsesko/ @incubos Санкт-Петербургский государственный политехнический университет 29 ноября 2013 г. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 1 / 73
  2. 2. Содержание 1 Введение 2 Actor Model 3 Futures and Promises 4 Dataflow Concurrency 5 Software Transactional Memory 6 Заключение Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 2 / 73
  3. 3. Введение Обо мне Обо мне 5 лет в Digitek Labs Параллельные системы цифровой обработки сигналов Статический анализ кода программных систем 2.5 года в Яндекс Распределённые высоконагруженные системы Преподавание Базы данных Формальные методы обеспечения качества ПО Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 3 / 73
  4. 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. 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. 6. Введение Проблема Проблема Источник боли Разделяемое состояние. А если точнее, то Изменяемое разделяемое состояние. И Часто оно неизбежно. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 6 / 73
  7. 7. Введение Классификация задач и подходов Классификация задач и подходов Shared State Concurrency (чугунная пуля) Невероятно сложно Даже для экспертов Координация независимых задач/процессов Планирование, игры Message-Passing Concurrency (Actor Model) Workflow-зависимые процессы Банковская сфера, MapReduce Dataflow Concurrency Консенсус и истинное разделяемое знание Банковская сфера Software Transactional Memory (STM) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 7 / 73
  8. 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. 9. Actor Model Actor Actor Всё это актор Функционируют параллельно Асинхронно обмениваются сообщениями При обработке сообщения актор может отправить конечное число сообщений другим акторам создать конечное число новых акторов назначить поведение для обработки следующего сообщения Порядок доставки сообщений не специфицирован Акторы имеют «адреса» Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 9 / 73
  10. 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. 11. Actor Model Реализации Реализации Языки3 с «родной» поддержкой: Erlang Scala ... Библиотеки для языков: Scala Java F# ... 3 http://en.wikipedia.org/wiki/Actor_model Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 11 / 73
  12. 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. 13. Actor Model Реализации Akka Будем использовать Akka (Scala API). Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 13 / 73
  14. 14. Actor Model Наш опыт Класс систем Яндекс.Авто Яндекс.Недвижимость ETL-процесс: 1 Extract — загрузка внешних данных 2 Transform — унификация, кластеризация, ... 3 Load — построение и раскладка индекса Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 14 / 73
  15. 15. Actor Model Наш опыт Статистика Данные: До 104 источников До 107 сущностей 20% обновляется ежедневно 2x рост за год Пользователи4 : Яндекс.Авто — 4.5 млн. чел. Яндекс.Недвижимость — 2 млн. чел. 4 http://stat.yandex.ru Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 15 / 73
  16. 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. 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. 18. Actor Model Akka Особенности реализации 300 байт на актор Актор: состояние, поведение, почтовый ящик, список детей, стратегия супервизора Множество акторов на множестве нитей Нет гарантированной доставки, семантика at-most-once, порядок сохраняется Сообщения обрабатываются строго по порядку Иерархия: создаваемые акторы — дети, родитель — супервизор Актор скрыт за переносимой ActorRef Подход «Let it crash» Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 18 / 73
  19. 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. 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. 21. Actor Model Akka Именование в локальной системе Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 21 / 73
  22. 22. Actor Model Akka Пути Типы путей: Логический Физический Особые пути: /user /system /deadLetters /temp /remote Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 22 / 73
  23. 23. Actor Model Akka Удалённое развёртывание Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 23 / 73
  24. 24. Actor Model Akka Actor Best Practices Не блокироваться Неизменяемые сообщения Нет разделяемому состоянию «Опасные» подзадачи в дочерние акторы События жизненного цикла Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 24 / 73
  25. 25. Actor Model Akka Основные фичи Actors Logging Scheduler Dispatchers Routing Remoting Serialization Testing FSM Fault Tolerance Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 25 / 73
  26. 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. 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. 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. 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. 30. Actor Model Практические примеры Диспетчеры и ящики Диспетчеры: Dispatcher PinnedDispatcher BalancingDispatcher CallingThreadDispatcher Почтовые ящики: UnboundedMailbox BoundedMailbox UnboundedPriorityMailbox BoundedPriorityMailbox Durable Mailboxes Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 30 / 73
  31. 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. 32. Actor Model Практические примеры Маршрутизаторы RoundRobinRouter RandomRouter SmallestMailboxRouter BroadcastRouter ScatterGatherFirstCompletedRouter Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 32 / 73
  33. 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. 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. 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. 36. Actor Model Практические примеры Тестирование акторов Модульное тестирование с TestActorRef Интеграционное тестирование с Probe Проверки с сопоставлением по шаблону Замедление времени Детализированные логи akka.actor.debug.* CallingThreadDispatcher Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 36 / 73
  37. 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. 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. 39. Actor Model Опыт Акторы Храните состояние вовне Стройте всю систему на акторах Пишите асинхронный код Избегайте косвенного взаимодействия акторов Баги есть, но быстро чинят Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 39 / 73
  40. 40. Actor Model Опыт Память и ящики Неограниченные ящики ⇒ неограниченная память при перегрузке Ограниченные ящики ⇒ возможные deadlock’и при наличии циклов ⇒ стройте системы без циклов Существует диспетчер по умолчанию Нет доступа к размеру ящика8 8 http: //letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2 Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 40 / 73
  41. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 60. Dataflow Concurrency Ограничения Ограничения Код должен быть без побочных эффектов — только «чистые» функции Подход не общего назначения Подходит для четко определенных изолированных модулей Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 60 / 73
  61. 61. Dataflow Concurrency Примитивы Примитивы Создание переменной потока данных Ожидание «связывания» переменной Связывание переменной Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 61 / 73
  62. 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. 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. 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. 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. 66. Software Transactional Memory Идея Идея Взгляд на память (Java Heap) как на транзакционный набор данных Похоже на БД: begin, commit, abort/rollback Транзакции автоматически перезапускаются при коллизиях rollback при ошибках Свойства ACI (из ACID) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 66 / 73
  67. 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. 68. Software Transactional Memory Свойства Свойства Достоинства Транзакции могут быть вложенными. Недостатки Все операции в области действия транзакции должны быть идемпотентными и не иметь побочных эффектов. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 68 / 73
  69. 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. 70. Software Transactional Memory Потенциальные проблемы Потенциальные проблемы Множественные коллизии: Низкая производительность и большие задержки Отсутствие прогресса (live locking) Несправедливость (unfairness) Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 70 / 73
  71. 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. 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. 73. Вопросы? Вопросы? http://incubos.org/contacts/ Общие вопросы — в Twitter: @incubos Вопросы по лекциям — в комментариях: http://incubos.org/blog/ Частные вопросы — в почту vadim.tsesko@gmail.com Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 73 / 73
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×