Actor Model Курс Параллельные вычисления Цесько Вадим Александрович http://kspt.ftk.spbstu.ru/people/tsesko/ @incubos Санкт-Петербургский государственный политехнический университет 29 ноября 2013 г. Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 1 / 73
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Консенсус и истинное разделяемое знаниеБанковская сфераSoftware Transactional Memory (STM)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 7 / 73
Actor Model Происхождение
Происхождение
Carl Hewitt1, Peter Bishop and Richard Steiger. AUniversal Modular Actor Formalism for ArtificialIntelligence. 1973.Gul Agha. Actors: A Model of ConcurrentComputation in Distributed Systems. 1986.Изначально для описания параллельныхвычисленийПозднее в качестве основы для многочисленныхреализаций
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 млн. чел.
4http://stat.yandex.ruЦесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 15 / 73
300 байт на акторАктор: состояние, поведение, почтовый ящик,список детей, стратегия супервизораМножество акторов на множестве нитейНет гарантированной доставки, семантикаat-most-once, порядок сохраняетсяСообщения обрабатываются строго по порядкуИерархия: создаваемые акторы — дети,родитель — супервизорАктор скрыт за переносимой ActorRefПодход «Let it crash»
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 18 / 73
Actor Model Akka
Ссылки
Чисто локальныеЛокальные ссылкиСсылки для маршрутизации (Router)Ссылки на удалённых акторовОсобые: PromiseActorRef, DeadLetterActorRef,EmptyLocalActorRef (DeadLetterActorRef)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 19 / 73
Actor Model Akka
Конструирование ссылок
Создание акторов: ActorSystem.actorOf илиActorContext.actorOfПоиск акторов: ActorSystem.actorFor илиActorContext.actorForКаждый актор знает себя, родителя и детей
Можно делать так:1 context.actorFor("../brother") ! msg2 context.actorFor("/user/service") ! msg3 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 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.empty7 }8
9 "A BurstScaler" should {10 "always forward the first message" in {11 probe.within(1 second) {12 burstScaler ! 113 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 Resume2 Restart3 Stop4 Escalate
Принятое решение (1-3) действует рекурсивноФункция Exception ⇒ DirectiveTerminated, preStart, preRestart, postStop,postRestartOneForOneStrategy и AllForOneStrategyОграничение количества перезапусков
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 37 / 73
Actor Model Практические примеры
Супервизор по умолчанию
1 final val defaultStrategy: SupervisorStrategy = {2 def defaultDecider: Decider = {3 case _: ActorInitializationException => Stop4 case _: ActorKilledException => Stop5 case _: Exception => Restart6 case _ => Escalate7 }8 OneForOneStrategy()(defaultDecider)9 }
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 38 / 73
Actor Model Опыт
Акторы
Храните состояние вовнеСтройте всю систему на акторахПишите асинхронный кодИзбегайте косвенного взаимодействия акторовБаги есть, но быстро чинят
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 39 / 73
Actor Model Опыт
Память и ящики
Неограниченные ящики ⇒ неограниченная памятьпри перегрузкеОграниченные ящики ⇒ возможные deadlock’ипри наличии циклов⇒ стройте системы без циклов ,Существует диспетчер по умолчаниюНет доступа к размеру ящика8
I thought of objects being like biological cells and/orindividual computers on a network, only able tocommunicate with messages (so messaging came at thevery beginning – it took a while to see how to domessaging in a programming language efficiently enoughto be useful).OOP to me means only messaging, local retention andprotection and hiding of state-process, and extremelate-binding of all things. It can be done in Smalltalk andin LISP. There are possibly other systems in which this ispossible, but I’m not aware of them.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 41 / 73
Futures and Promises
Futures and Promises
David RossSo a Promise can be broken, but you can’t change theFuture. Love the metaphors.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 42 / 73
Futures and Promises Происхождение
Происхождение
Henry Baker and Carl Hewitt. The IncrementalGarbage Collection of Processes9. 1977.
FutureСтруктура данных для синхронного(блокирующегося) или асинхронного(неблокирующегося) извлечения результатапараллельной операции.
9http://en.wikipedia.org/wiki/Futures_and_promisesЦесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 43 / 73
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 53 / 73
Futures and Promises Аkka Futures
Futures: Callbacks1 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: IllegalStateException3 if ise.getMessage == "OHNOES" =>4 // OHNOES! We are in deep trouble, do something!5 case e: Exception =>6 // Do something else7 }
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 _ => watchSomeTV5 }
Цесько В. А. (СПбГПУ) 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 => 03 }
Или так: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, Techniquesand Models of Computer Programming10.
10http://www.info.ucl.ac.be/~pvr/book.htmlЦесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 58 / 73
Код должен быть без побочных эффектов —только «чистые» функцииПодход не общего назначенияПодходит для четко определенных изолированныхмодулей
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 60 / 73
Dataflow Concurrency Примитивы
Примитивы
Создание переменной потока данныхОжидание «связывания» переменнойСвязывание переменной
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 61 / 73
Dataflow Concurrency Примеры
Dataflow Delimiter (1)
1 import Future.flow2
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.flow2
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.flow3
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 FunctionalLanguages. 1986.Maurice Herlihy and J. Eliot B. Moss. TransactionalMemory: Architectural Support for Lock-free DataStructures. 1993.Nir Shavit and Dan Touitou. Software TransactionalMemory. 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 ScalaHaskelletc
Ссылки:Rich Hickey. Persistent Data Structures and ManagedReferences13
12http://clojure.org/state13http:
//www.infoq.com/presentations/Value-Identity-State-Rich-HickeyЦесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 67 / 73
НедостаткиВсе операции в области действия транзакции должныбыть идемпотентными и не иметь побочныхэффектов.
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 68 / 73
Software Transactional Memory Примеры
Akka Transactional Agents1 def transfer(from: Agent[Int], to: Agent[Int], amount: Int):
Boolean = {2 atomic { txn =>3 if (from.get < amount) false4 else {5 from send (_ - amount)6 to send (_ + amount)7 true8 }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 // -> 5016 val toValue = to.await // -> 70
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 69 / 73
Software Transactional Memory Потенциальные проблемы
Потенциальные проблемы
Множественные коллизии:Низкая производительность и большие задержкиОтсутствие прогресса (live locking)Несправедливость (unfairness)
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 70 / 73
Заключение
Заключение
Параллельные программы — это неизбежноНужны более простые способы созданиякорректных параллельных программныхсистемНизкоуровневый параллелизм — это чрезвычайносложноНо есть альтернативы14:
http://incubos.org/contacts/Общие вопросы — в Twitter: @incubosВопросы по лекциям — в комментариях:http://incubos.org/blog/Частные вопросы — в почту[email protected]
Цесько В. А. (СПбГПУ) Actor Model 29 ноября 2013 г. 73 / 73