The document discusses the actor model, a computational model for concurrent computation where actors communicate asynchronously by message passing. An actor is an entity that can concurrently send messages to other actors, create new actors, and determine how to respond to the next received message. Implementations of the actor model include Erlang and Akka, a toolkit for Scala and Java. The document provides examples of how actors are defined and messages are sent in Akka.
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
Actor model
1. Actor Model
Êóðñ ¾Ïàðàëëåëüíûå âû÷èñëåíèÿ¿
Öåñüêî Âàäèì Àëåêñàíäðîâè÷
https://incubos.org
Ñàíêò-Ïåòåðáóðãñêèé ãîñóäàðñòâåííûé ïîëèòåõíè÷åñêèé óíèâåðñèòåò
21 íîÿáðÿ 2014 ã.
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 1 / 61
2. Ñîäåðæàíèå
1 Ââåäåíèå
2 Actor Model
3 Futures and Promises
4 Ïðèìåðû ñèñòåì
5 Çàêëþ÷åíèå
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 2 / 61
3. Ââåäåíèå 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.
ahttp://www.slideshare.net/jboner/
state-youre-doing-it-wrong-javaone-2009
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 3 / 61
4. Ââåäåíèå Ïàðàëëåëüíîå ïðîãðàììèðîâàíèå
Ïàðàëëåëüíîå ïðîãðàììèðîâàíèå
Damien Katz
Beginner: Threads are hard.
Intermediate: Don’t fear multithreading.
Expert: Threads are hard.
Òåì íå ìåíåå
The free lunch is overa.
aHerb Sutter. The Free Lunch Is Over. 2009
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 4 / 61
5. Ââåäåíèå Ïðîáëåìà
Ïðîáëåìà
Èñòî÷íèê áîëè
Ðàçäåëÿåìîå ñîñòîÿíèå.
À åñëè òî÷íåå, òî
Èçìåíÿåìîå ðàçäåëÿåìîå ñîñòîÿíèå.
È
×àñòî îíî íåèçáåæíî.
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 5 / 61
6. Ââåäåíèå Êëàññèôèêàöèÿ çàäà÷ è ïîäõîäîâ
Êëàññèôèêàöèÿ çàäà÷ è ïîäõîäîâ
Shared State Concurrency (÷óãóííàÿ ïóëÿ)
Íåâåðîÿòíî ñëîæíî
Äàæå äëÿ ýêñïåðòîâ
Êîîðäèíàöèÿ íåçàâèñèìûõ çàäà÷/ïðîöåññîâ
Ïëàíèðîâàíèå, èãðû
Message-Passing Concurrency (Actor Model)
Workflow-çàâèñèìûå ïðîöåññû
Áàíêîâñêàÿ ñôåðà, MapReduce, Spark, etc.
Dataflow Concurrency
Êîíñåíñóñ è èñòèííîå ðàçäåëÿåìîå çíàíèå
Áàíêîâñêàÿ ñôåðà
Software Transactional Memory (STM)
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 6 / 61
7. 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.
Èçíà÷àëüíî äëÿ îïèñàíèÿ ïàðàëëåëüíûõ
âû÷èñëåíèé
Ïîçäíåå â êà÷åñòâå îñíîâû äëÿ ìíîãî÷èñëåííûõ
ðåàëèçàöèé
1http://letitcrash.com/post/20964174345/
carl-hewitt-explains-the-essence-of-the-actor
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 7 / 61
8. Actor Model Actor
Actor
Âñ¼ ýòî àêòîð
Ôóíêöèîíèðóþò ïàðàëëåëüíî
Àñèíõðîííî îáìåíèâàþòñÿ ñîîáùåíèÿìè
Ïðè îáðàáîòêå ñîîáùåíèÿ àêòîð ìîæåò
îòïðàâèòü êîíå÷íîå ÷èñëî ñîîáùåíèé äðóãèì àêòîðàì
ñîçäàòü êîíå÷íîå ÷èñëî íîâûõ àêòîðîâ
íàçíà÷èòü ïîâåäåíèå äëÿ îáðàáîòêè ñëåäóþùåãî
ñîîáùåíèÿ
Ïîðÿäîê äîñòàâêè ñîîáùåíèé íå ñïåöèôèöèðîâàí
Àêòîðû èìåþò ¾àäðåñà¿
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 8 / 61
9. Actor Model Concurrency vs Parallelism
Concurrency vs Parallelism
Actor Model íå î Parallelism, à î Concurrency2
Concurrency
Ñïîñîáíîñòü âûïîëíÿòüñÿ ïàðàëëåëüíî.
Parallelism
Äåéñòâèòåëüíî ïàðàëëåëüíîå âûïîëíåíèå.
2Rob Pike. Concurrency is not Parallelism:
https://player.vimeo.com/video/49718712
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 9 / 61
10. Actor Model Ðåàëèçàöèè
Ðåàëèçàöèè
ßçûêè3 ñ ¾ðîäíîé¿ ïîääåðæêîé:
Erlang
Scala
...
Áèáëèîòåêè äëÿ ÿçûêîâ:
Scala
Java
F#
...
3http://en.wikipedia.org/wiki/Actor_model
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 10 / 61
11. Actor Model Ðåàëèçàöèè
Erlang
Joe Armstrong, Ericsson, 1986
Äëÿ ðàçðàáîòêè ðàñïðåäåë¼ííûõ,
îòêàçîóñòîé÷èâûõ, íåîñòàíàâëèâàþùèõñÿ
ïðèëîæåíèé ìÿãêîãî ðåàëüíîãî âðåìåíè
Ïîääåðæèâàåò ¾ãîðÿ÷óþ¿ çàìåíó êîäà
Ïðèìåð ÏÎ êîììóòàòîðà Ericsson AXD301
ìèëëèîí ñòðîê êîäà
äîñòóïíîñòü 0.999999999 (31 ms/year downtime)
Parallelism vs Concurrency
Ïîääåðæêà SMP â 2006.
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 11 / 61
12. Actor Model Ðåàëèçàöèè
Akka
Áóäåì èñïîëüçîâàòü
Akka (Scala API).
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 12 / 61
13. 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 21 íîÿáðÿ 2014 ã. 13 / 61
14. Actor Model Akka
Ïðîèçâîäèòåëüíîñòü
Âíèìàíèå
Ñèíòåòè÷åñêèå òåñòû ,
Erlang R14B04 vs Akka 2.0-SNAPSHOT4:
1M mps vs 2.1M mps
Akka 2.05:
50M mps
48-core, 128 GB, ForkJoinPool
4http://letitcrash.com/post/14783691760/akka-vs-erlang
5http://letitcrash.com/post/20397701710/
50-million-messages-per-second-on-a-single-machine
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 14 / 61
16. Actor Model Akka
Ïóòè
Ïðèìåðû
akka://system/user/a/b
akka.tcp://system@server.yandex.ru:2552/user/a/b
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 16 / 61
17. Actor Model Akka
Êîíñòðóèðîâàíèå ññûëîê
Ñîçäàíèå àêòîðîâ: ActorRefProvider.actorOf
Ïîèñê àêòîðîâ:
ActorRefProvider.actorSelection
Êàæäûé àêòîð çíàåò ñåáÿ, ðîäèòåëÿ è äåòåé
Ìîæíî äåëàòü òàê:
1 context.actorSelection(../brother) ! msg
2 context.actorSelection(/user/service) ! msg
3 context.actorSelection(../*) ! msg
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 17 / 61
18. Actor Model Akka
Îïðåäåëåíèå àêòîðà
1 class Partitioner(partitionStorage: ActorRef) extends Actor {
2
3 def receive = {
4 case PartitionFeed(partner, offers) =
5 partition(partner, offers)
6 case msg =
7 log.error(Unsupported message received: {}, msg)
8 }
9
10 def partition(partner: Partner, offers: Traversable[Offer]) {
11 ...
12
13 partitionStorage ! UpdatePartitions(partner, partitioning)
14 }
15 }
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 18 / 61
19. Actor Model Akka
Ñîçäàíèå àêòîðà
1 val system = ActorSystem(sharder)
2
3 val partitionStorage = ...
4
5 val partitioner =
6 system.actorOf(
7 FromConfig.props(
8 Props[Partitioner](new Partitioner(partitionStorage))
9 .withDispatcher(dispatcher.cpu)),
10 partitioner)
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 19 / 61
20. Actor Model Akka
Êîíôèãóðàöèÿ äèñïåò÷åðà
Êîíôèãóðàöèÿ â HOCON6:
1 dispatchers.cpu {
2 type = Dispatcher
3 executor = fork-join-executor
4
5 fork-join-executor {
6 parallelism-min = 4
7 parallelism-factor = 1.0
8 }
9 }
6Human-Optimized Config Object Notation:
https://github.com/typesafehub/config
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 20 / 61
21. Actor Model Akka
HOCON
Íåçàâèñèìàÿ ñàìîöåííàÿ áèáëèîòåêà:
×èñòàÿ Java áåç çàâèñèìîñòåé
Ïîääåðæèâàåò Java properties è JSON superset
Merge è include èç ôàéëîâ, URL, classpath
Ìîùíàÿ ïîääåðæêà âëîæåííîñòè
Ïîääåðæêà duration (10 seconds) è size (512K)
Êîíâåðòàöèÿ òèïîâ
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 21 / 61
22. Actor Model Akka
Äèñïåò÷åðû
Dispatcher
PinnedDispatcher
BalancingDispatcher
CallingThreadDispatcher
íà
fork-join-executor
thread-pool-executor
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 22 / 61
23. Actor Model Akka
Ïî÷òîâûå ÿùèêè
UnboundedMailbox
BoundedMailbox
UnboundedPriorityMailbox
BoundedPriorityMailbox
1 trait MessageQueue {
2 def enqueue(receiver: ActorRef, handle: Envelope): Unit
3 def dequeue(): Envelope
4 def numberOfMessages: Int
5 def hasMessages: Boolean
6 def cleanUp(owner: ActorRef, deadLetters: MessageQueue): Unit
7 }
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 23 / 61
25. Actor Model Akka
Òèïû ðîóòåðîâ
Ðåàëèçàöèè Pool è Group:
RoundRobin
Random
SmallestMailbox
Broadcast
ScatterGatherFirstCompleted
Ñàìîïèñíûå
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 25 / 61
26. Actor Model Akka
Êîíôèãóðèðîâàíèå èç êîäà
1 val shardActorPaths: immutable.Seq[String] = ...
2
3 val shard = system.actorOf(
4 RoundRobinGroup(shardActorPaths).props(),
5 shard)
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 26 / 61
27. Actor Model Akka
Óäàë¼ííûå àêòîðû
1 akka {
2 actor {
3 provider = akka.remote.RemoteActorRefProvider
4 }
5
6 remote {
7 enabled-transports = [akka.remote.netty.tcp]
8
9 netty.tcp {
10 hostname = server.yandex.ru
11 port = 2553
12 }
13 }
14 }
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 27 / 61
28. Actor Model Akka
Òåñòèðîâàíèå àêòîðîâ
Ìîäóëüíîå òåñòèðîâàíèå ñ TestActorRef
Èíòåãðàöèîííîå òåñòèðîâàíèå ñ Probe
Ïðîâåðêè ñ ñîïîñòàâëåíèåì ïî øàáëîíó
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 28 / 61
29. Actor Model Akka
Ïðèìåð òåñòà
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 21 íîÿáðÿ 2014 ã. 29 / 61
30. Actor Model Akka
Ñóïåðâèçîð
Ðåøåíèå ïðè ñáîå:
1 Resume
2 Restart
3 Stop
4 Escalate
Ïðèíÿòîå ðåøåíèå (1-3) äåéñòâóåò ðåêóðñèâíî
Ôóíêöèÿ Exception ) Directive
Terminated, preStart, preRestart, postStop,
postRestart
OneForOneStrategy è AllForOneStrategy
Îãðàíè÷åíèå êîëè÷åñòâà ïåðåçàïóñêîâ
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 30 / 61
31. Actor Model Akka
Ñóïåðâèçîð ïî óìîë÷àíèþ
1 final val defaultDecider: Decider = {
2 case _: ActorInitializationException = Stop
3 case _: ActorKilledException = Stop
4 case _: DeathPactException = Stop
5 case _: Exception = Restart
6 }
7
8 final val defaultStrategy: SupervisorStrategy =
9 OneForOneStrategy()(defaultDecider)
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 31 / 61
32. Actor Model Îïûò
Àêòîðû
Õðàíèòå ñîñòîÿíèå âîâíå
Ñòðîéòå âñþ ñèñòåìó íà àêòîðàõ
Ïèøèòå àñèíõðîííûé êîä
Èçáåãàéòå êîñâåííîãî âçàèìîäåéñòâèÿ àêòîðîâ
Áàãè åñòü, íî áûñòðî ÷èíÿò
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 32 / 61
33. Actor Model Îïûò
Ïàìÿòü è ÿùèêè
Íåîãðàíè÷åííûå ÿùèêè ) íåîãðàíè÷åííàÿ ïàìÿòü
ïðè ïåðåãðóçêå
Îãðàíè÷åííûå ÿùèêè ) âîçìîæíûå deadlock’è
ïðè íàëè÷èè öèêëîâ
) ñòðîéòå ñèñòåìû áåç öèêëîâ ,
Ñóùåñòâóåò äèñïåò÷åð ïî óìîë÷àíèþ
Íåò äîñòóïà ê ðàçìåðó ÿùèêà7
7http:
//letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 33 / 61
34. 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 21 íîÿáðÿ 2014 ã. 34 / 61
35. 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 21 íîÿáðÿ 2014 ã. 35 / 61
36. Futures and Promises Ïðîèñõîæäåíèå
Ïðîèñõîæäåíèå
Henry Baker and Carl Hewitt. The Incremental
Garbage Collection of Processes8. 1977.
Future
Ñòðóêòóðà äàííûõ äëÿ ñèíõðîííîãî
(áëîêèðóþùåãîñÿ) èëè àñèíõðîííîãî
(íåáëîêèðóþùåãîñÿ) èçâëå÷åíèÿ ðåçóëüòàòà
ïàðàëëåëüíîé îïåðàöèè.
8http://en.wikipedia.org/wiki/Futures_and_promises
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 36 / 61
37. Futures and Promises Ðåàëèçàöèè
Ðåàëèçàöèè
Java (java.util.concurrent.Future)
Scala
C#
Python
Haskell
Clojure
Oz
R
Scheme
Node.js
Akka
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 37 / 61
38. 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 21 íîÿáðÿ 2014 ã. 38 / 61
39. 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 21 íîÿáðÿ 2014 ã. 39 / 61
40. 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 21 íîÿáðÿ 2014 ã. 40 / 61
41. 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 21 íîÿáðÿ 2014 ã. 41 / 61
42. 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 21 íîÿáðÿ 2014 ã. 42 / 61
43. 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 21 íîÿáðÿ 2014 ã. 43 / 61
44. 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 21 íîÿáðÿ 2014 ã. 44 / 61
45. 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 21 íîÿáðÿ 2014 ã. 45 / 61
47. 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 Success(result) = doSomethingOnSuccess(result)
3 case Failure(error) = doSomethingOnFailure(error)
4 }
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 47 / 61
48. 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 21 íîÿáðÿ 2014 ã. 48 / 61
49. 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 21 íîÿáðÿ 2014 ã. 49 / 61
50. 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 21 íîÿáðÿ 2014 ã. 50 / 61
51. Ïðèìåðû ñèñòåì Êëàññèôèêàöèÿ
Êëàññèôèêàöèÿ
Êîíâåéåðíàÿ èíäåêñàöèÿ
ßíäåêñ.{Àâòî, Íåäâèæèìîñòü, Ðàáîòà}
etc.
Èåðàðõè÷åñêàÿ îáðàáîòêà ïîëüçîâàòåëüñêèõ
çàïðîñîâ
Spray9
Ìàðøðóòèçàöèÿ è îáðàáîòêà êëèêîâ è ïîêàçîâ
Ìàò÷èíã îáúÿâëåíèé íà ïîäïèñêè
etc.
9http://spray.io
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 51 / 61
52. Ïðèìåðû ñèñòåì Êîíâåéåð
Êîíâåéåð
Ìàñøòàáèðóåìîñòü
Óñòîé÷èâîñòü ê ñáîÿì
Îãðàíè÷åííûå î÷åðåäè
Back pressure
Âûäåëåííûå äèñïåò÷åðû
Äåòåðìèíèðîâàííîå
ïîòðåáëåíèå ïàìÿòè
Ãðàôèêè ðàçìåðîâ î÷åðåäåé
Äåêîìïîçèöèÿ ñòàäèé
Ìàñøòàáèðîâàíèå ïóëàìè
Çàãðóçêà CPU 100%
Öåñüêî Â. À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 52 / 61
53. Ïðèìåðû ñèñòåì Êîíâåéåð
ßíäåêñ.Àâòî: Àðõèòåêòóðà
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 53 / 61
54. Ïðèìåðû ñèñòåì Êîíâåéåð
ßíäåêñ.Àâòî: Ãèïåðêîíâåéåð
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 54 / 61
55. Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà
Èåðàðõè÷åñêàÿ îáðàáîòêà
Ìàñøòàáèðóåìîñòü
Âûñîêàÿ äîñòóïíîñòü
Åñòåñòâåííûå ïîäñèñòåìû
×àñòî äèíàìè÷åñêàÿ
òîïîëîãèÿ
Actor per request
Request-reply
Öåñüêî Â. À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 55 / 61