SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
Actor Model 
Êóðñ ¾Ïàðàëëåëüíûå âû÷èñëåíèÿ¿ 
Öåñüêî Âàäèì Àëåêñàíäðîâè÷ 
https://incubos.org 
Ñàíêò-Ïåòåðáóðãñêèé ãîñóäàðñòâåííûé ïîëèòåõíè÷åñêèé óíèâåðñèòåò 
21 íîÿáðÿ 2014 ã. 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 1 / 61
Ñîäåðæàíèå 
1 Ââåäåíèå 
2 Actor Model 
3 Futures and Promises 
4 Ïðèìåðû ñèñòåì 
5 Çàêëþ÷åíèå 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 2 / 61
Ââåäåíèå 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
Ââåäåíèå Ïàðàëëåëüíîå ïðîãðàììèðîâàíèå 
Ïàðàëëåëüíîå ïðîãðàììèðîâàíèå 
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
Ââåäåíèå Ïðîáëåìà 
Ïðîáëåìà 
Èñòî÷íèê áîëè 
Ðàçäåëÿåìîå ñîñòîÿíèå. 
À åñëè òî÷íåå, òî 
Èçìåíÿåìîå ðàçäåëÿåìîå ñîñòîÿíèå. 
È 
×àñòî îíî íåèçáåæíî. 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 5 / 61
Ââåäåíèå Êëàññèôèêàöèÿ çàäà÷ è ïîäõîäîâ 
Êëàññèôèêàöèÿ çàäà÷ è ïîäõîäîâ 
Shared State Concurrency (÷óãóííàÿ ïóëÿ) 
Íåâåðîÿòíî ñëîæíî 
Äàæå äëÿ ýêñïåðòîâ 
Êîîðäèíàöèÿ íåçàâèñèìûõ çàäà÷/ïðîöåññîâ 
Ïëàíèðîâàíèå, èãðû 
Message-Passing Concurrency (Actor Model) 
Workflow-çàâèñèìûå ïðîöåññû 
Áàíêîâñêàÿ ñôåðà, MapReduce, Spark, etc. 
Dataflow Concurrency 
Êîíñåíñóñ è èñòèííîå ðàçäåëÿåìîå çíàíèå 
Áàíêîâñêàÿ ñôåðà 
Software Transactional Memory (STM) 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 6 / 61
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
Actor Model Actor 
Actor 
Âñ¼ ýòî àêòîð 
Ôóíêöèîíèðóþò ïàðàëëåëüíî 
Àñèíõðîííî îáìåíèâàþòñÿ ñîîáùåíèÿìè 
Ïðè îáðàáîòêå ñîîáùåíèÿ àêòîð ìîæåò 
îòïðàâèòü êîíå÷íîå ÷èñëî ñîîáùåíèé äðóãèì àêòîðàì 
ñîçäàòü êîíå÷íîå ÷èñëî íîâûõ àêòîðîâ 
íàçíà÷èòü ïîâåäåíèå äëÿ îáðàáîòêè ñëåäóþùåãî 
ñîîáùåíèÿ 
Ïîðÿäîê äîñòàâêè ñîîáùåíèé íå ñïåöèôèöèðîâàí 
Àêòîðû èìåþò ¾àäðåñà¿ 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 8 / 61
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
Actor Model Ðåàëèçàöèè 
Ðåàëèçàöèè 
ßçûêè3 ñ ¾ðîäíîé¿ ïîääåðæêîé: 
Erlang 
Scala 
... 
Áèáëèîòåêè äëÿ ÿçûêîâ: 
Scala 
Java 
F# 
... 
3http://en.wikipedia.org/wiki/Actor_model 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 10 / 61
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
Actor Model Ðåàëèçàöèè 
Akka 
Áóäåì èñïîëüçîâàòü 
Akka (Scala API). 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 12 / 61
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
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
Actor Model Akka 
Îñîáåííîñòè ðåàëèçàöèè 
300 áàéò íà àêòîð 
Àêòîð: ñîñòîÿíèå, ïîâåäåíèå, ïî÷òîâûé ÿùèê, 
ñïèñîê äåòåé, ñòðàòåãèÿ ñóïåðâèçîðà 
Ìíîæåñòâî àêòîðîâ íà ìíîæåñòâå íèòåé 
Íåò ãàðàíòèðîâàííîé äîñòàâêè, ñåìàíòèêà 
at-most-once, ïîðÿäîê ñîõðàíÿåòñÿ 
Ñîîáùåíèÿ îáðàáàòûâàþòñÿ ñòðîãî ïî ïîðÿäêó 
Èåðàðõèÿ: ñîçäàâàåìûå àêòîðû  äåòè, 
ðîäèòåëü  ñóïåðâèçîð 
Àêòîð ñêðûò çà ïåðåíîñèìîé ActorRef 
Ïîäõîä ¾Let it crash¿ 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 15 / 61
Actor Model Akka 
Ïóòè 
Ïðèìåðû 
akka://system/user/a/b 
akka.tcp://system@server.yandex.ru:2552/user/a/b 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 16 / 61
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
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
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
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
Actor Model Akka 
HOCON 
Íåçàâèñèìàÿ ñàìîöåííàÿ áèáëèîòåêà: 
×èñòàÿ Java áåç çàâèñèìîñòåé 
Ïîääåðæèâàåò Java properties è JSON superset 
Merge è include èç ôàéëîâ, URL, classpath 
Ìîùíàÿ ïîääåðæêà âëîæåííîñòè 
Ïîääåðæêà duration (10 seconds) è size (512K) 
Êîíâåðòàöèÿ òèïîâ 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 21 / 61
Actor Model Akka 
Äèñïåò÷åðû 
Dispatcher 
PinnedDispatcher 
BalancingDispatcher 
CallingThreadDispatcher 
íà 
fork-join-executor 
thread-pool-executor 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 22 / 61
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
Actor Model Akka 
Ïóëû àêòîðîâ 
1 akka.actor.deployment { 
2 /partitioner { 
3 router = smallest-mailbox-pool 
4 nr-of-instances = 4 
5 } 
6 } 
1 akka.actor.deployment { 
2 /unifier { 
3 router = round-robin-pool 
4 resizer { 
5 lower-bound = 2 
6 upper-bound = 16 
7 } 
8 } 
9 } 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 24 / 61
Actor Model Akka 
Òèïû ðîóòåðîâ 
Ðåàëèçàöèè Pool è Group: 
RoundRobin 
Random 
SmallestMailbox 
Broadcast 
ScatterGatherFirstCompleted 
Ñàìîïèñíûå 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 25 / 61
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
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
Actor Model Akka 
Òåñòèðîâàíèå àêòîðîâ 
Ìîäóëüíîå òåñòèðîâàíèå ñ TestActorRef 
Èíòåãðàöèîííîå òåñòèðîâàíèå ñ Probe 
Ïðîâåðêè ñ ñîïîñòàâëåíèåì ïî øàáëîíó 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 28 / 61
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
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
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
Actor Model Îïûò 
Àêòîðû 
Õðàíèòå ñîñòîÿíèå âîâíå 
Ñòðîéòå âñþ ñèñòåìó íà àêòîðàõ 
Ïèøèòå àñèíõðîííûé êîä 
Èçáåãàéòå êîñâåííîãî âçàèìîäåéñòâèÿ àêòîðîâ 
Áàãè åñòü, íî áûñòðî ÷èíÿò 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 32 / 61
Actor Model Îïûò 
Ïàìÿòü è ÿùèêè 
Íåîãðàíè÷åííûå ÿùèêè ) íåîãðàíè÷åííàÿ ïàìÿòü 
ïðè ïåðåãðóçêå 
Îãðàíè÷åííûå ÿùèêè ) âîçìîæíûå deadlock’è 
ïðè íàëè÷èè öèêëîâ 
) ñòðîéòå ñèñòåìû áåç öèêëîâ , 
Ñóùåñòâóåò äèñïåò÷åð ïî óìîë÷àíèþ 
Íåò äîñòóïà ê ðàçìåðó ÿùèêà7 
7http: 
//letitcrash.com/post/17707262394/why-no-mailboxsize-in-akka-2 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 33 / 61
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
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
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
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
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
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
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
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
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
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
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
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
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 21 íîÿáðÿ 2014 ã. 46 / 61
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
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
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
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
Ïðèìåðû ñèñòåì Êëàññèôèêàöèÿ 
Êëàññèôèêàöèÿ 
Êîíâåéåðíàÿ èíäåêñàöèÿ 
ßíäåêñ.{Àâòî, Íåäâèæèìîñòü, Ðàáîòà} 
etc. 
Èåðàðõè÷åñêàÿ îáðàáîòêà ïîëüçîâàòåëüñêèõ 
çàïðîñîâ 
Spray9 
Ìàðøðóòèçàöèÿ è îáðàáîòêà êëèêîâ è ïîêàçîâ 
Ìàò÷èíã îáúÿâëåíèé íà ïîäïèñêè 
etc. 
9http://spray.io 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 51 / 61
Ïðèìåðû ñèñòåì Êîíâåéåð 
Êîíâåéåð 
Ìàñøòàáèðóåìîñòü 
Óñòîé÷èâîñòü ê ñáîÿì 
Îãðàíè÷åííûå î÷åðåäè 
Back pressure 
Âûäåëåííûå äèñïåò÷åðû 
Äåòåðìèíèðîâàííîå 
ïîòðåáëåíèå ïàìÿòè 
Ãðàôèêè ðàçìåðîâ î÷åðåäåé 
Äåêîìïîçèöèÿ ñòàäèé 
Ìàñøòàáèðîâàíèå ïóëàìè 
Çàãðóçêà CPU 100% 
Öåñüêî Â. À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 52 / 61
Ïðèìåðû ñèñòåì Êîíâåéåð 
ßíäåêñ.Àâòî: Àðõèòåêòóðà 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 53 / 61
Ïðèìåðû ñèñòåì Êîíâåéåð 
ßíäåêñ.Àâòî: Ãèïåðêîíâåéåð 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 54 / 61
Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà 
Èåðàðõè÷åñêàÿ îáðàáîòêà 
Ìàñøòàáèðóåìîñòü 
Âûñîêàÿ äîñòóïíîñòü 
Åñòåñòâåííûå ïîäñèñòåìû 
×àñòî äèíàìè÷åñêàÿ 
òîïîëîãèÿ 
Actor per request 
Request-reply 
Öåñüêî Â. À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 55 / 61
Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà 
Èåðàðõè÷åñêèå ñèñòåìû 
Âíóòðåííèå ñåðâèñû 
Èåðàðõèÿ àêòîðîâ äëÿ êàæäîãî àêòèâíîãî 
ïîëüçîâàòåëÿ/ïîäïèñêè/âèçèòà/çàïðîñà 
Äèíàìè÷åñêàÿ âûãðóçêà/ïîäãðóçêà ñóùíîñòåé 
Ðàñïðåäåëåíèå ïîëüçîâàòåëåé íà áàêåòû (è íîäû) 
÷åðåç ZooKeeper + Curator10 (Consistent Hashing11) 
10http://curator.apache.org 
11http://en.wikipedia.org/wiki/Consistent_hashing 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 56 / 61
Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà 
Êîìïîíåíò ñåðâèñà óâåäîìëåíèé 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 57 / 61
Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà 
Î ÷¼ì íóæíî äóìàòü 
Íàáëþäàåìîñòü 
Ëîããèðîâàíèå 
Àãðåãàòíûå ãðàôèêè 
Ìîíèòîðèíãè 
Ïîâåäåíèå ïðè ïåðåãðóçêå 
Äåòåêòèðîâàíèå ïåðåãðóçêè 
Îãðàíè÷åíèå ðåñóðñîâ 
Ïðåâåíòèâíûé reject 
Âîññòàíîâëåíèå ïîñëå ïåðåãðóçêè 
Âûðàâíèâàíèå íàãðóçêè 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 58 / 61
Çàêëþ÷åíèå 
Çàêëþ÷åíèå 
Ïàðàëëåëüíûå ïðîãðàììû  ýòî íåèçáåæíî 
Íóæíû áîëåå ïðîñòûå ñïîñîáû ñîçäàíèÿ 
êîððåêòíûõ ïàðàëëåëüíûõ ïðîãðàììíûõ 
ñèñòåì 
Íèçêîóðîâíåâûé ïàðàëëåëèçì  ýòî ÷ðåçâû÷àéíî 
ñëîæíî 
Íî åñòü àëüòåðíàòèâû12: 
Message-Passing Concurrency (Actor Model) 
Dataflow Concurrency 
Software Transactional Memory (STM) 
No Silver Bullet 
12ScalaDays 2013. Concurrency  The good, the bad, the ugly: 
http://www.parleys.com/play/51c0bc58e4b0ed877035680a/ 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 59 / 61
Çàêëþ÷åíèå Êóäà äâèãàòüñÿ äàëüøå 
Êóäà äâèãàòüñÿ äàëüøå 
Typesafe Activator13 
Reactive Manifesto14 
Principles of Reactive Programming15 
Êíèãè: 
Jamie Allen. Effective Akka. 2013 
Derek Wyatt. Akka Concurrency. 2013 
Series: The Neophyte’s Guide to Scala16 
EAI Patterns Series17 
Chris Okasaki. Purely Functional Data Structures. 1999 
JCIP 2nd edition + JMM 
13http://typesafe.com/activator 
14http://www.reactivemanifesto.org 
15https://class.coursera.org/reactive-001/class 
16http://letitcrash.com/post/64667109914/ 
series-the-neophytes-guide-to-scala 
17http://letitcrash.com/post/59190266995/ 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 60 / 61
Âîïðîñû? 
Âîïðîñû? 
http://incubos.org/ 
Îáùèå âîïðîñû  â Twitter: @incubos 
Âîïðîñû ïî ëåêöèÿì  â êîììåíòàðèÿõ: 
http://incubos.org/blog/ 
×àñòíûå âîïðîñû  â ïî÷òó incubos@yandex.ru 
Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 61 / 61

Mais conteúdo relacionado

Destaque

Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
Vadim Tsesko
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
Vadim Tsesko
 

Destaque (10)

Фреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в ЯндексеФреймворк Akka и его использование в Яндексе
Фреймворк Akka и его использование в Яндексе
 
Actor model
Actor modelActor model
Actor model
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed Commit
 
Базы данных. HBase
Базы данных. HBaseБазы данных. HBase
Базы данных. HBase
 
Базы данных. CAP
Базы данных. CAPБазы данных. CAP
Базы данных. CAP
 
Базы данных. Введение
Базы данных. ВведениеБазы данных. Введение
Базы данных. Введение
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & Cache
 
Actor model. Futures & Promises. Reactive Streams.
Actor model. Futures & Promises. Reactive Streams.Actor model. Futures & Promises. Reactive Streams.
Actor model. Futures & Promises. Reactive Streams.
 
Потоковая фильтрация событий
Потоковая фильтрация событийПотоковая фильтрация событий
Потоковая фильтрация событий
 
YoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.ВертикаляхYoctoDB в Яндекс.Вертикалях
YoctoDB в Яндекс.Вертикалях
 

Último

+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 

Último (20)

The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodology
 
ManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide Deck
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
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
  • 15. Actor Model Akka Îñîáåííîñòè ðåàëèçàöèè 300 áàéò íà àêòîð Àêòîð: ñîñòîÿíèå, ïîâåäåíèå, ïî÷òîâûé ÿùèê, ñïèñîê äåòåé, ñòðàòåãèÿ ñóïåðâèçîðà Ìíîæåñòâî àêòîðîâ íà ìíîæåñòâå íèòåé Íåò ãàðàíòèðîâàííîé äîñòàâêè, ñåìàíòèêà at-most-once, ïîðÿäîê ñîõðàíÿåòñÿ Ñîîáùåíèÿ îáðàáàòûâàþòñÿ ñòðîãî ïî ïîðÿäêó Èåðàðõèÿ: ñîçäàâàåìûå àêòîðû äåòè, ðîäèòåëü ñóïåðâèçîð Àêòîð ñêðûò çà ïåðåíîñèìîé ActorRef Ïîäõîä ¾Let it crash¿ Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 15 / 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
  • 24. Actor Model Akka Ïóëû àêòîðîâ 1 akka.actor.deployment { 2 /partitioner { 3 router = smallest-mailbox-pool 4 nr-of-instances = 4 5 } 6 } 1 akka.actor.deployment { 2 /unifier { 3 router = round-robin-pool 4 resizer { 5 lower-bound = 2 6 upper-bound = 16 7 } 8 } 9 } Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 24 / 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
  • 46. 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 21 íîÿáðÿ 2014 ã. 46 / 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
  • 56. Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà Èåðàðõè÷åñêèå ñèñòåìû Âíóòðåííèå ñåðâèñû Èåðàðõèÿ àêòîðîâ äëÿ êàæäîãî àêòèâíîãî ïîëüçîâàòåëÿ/ïîäïèñêè/âèçèòà/çàïðîñà Äèíàìè÷åñêàÿ âûãðóçêà/ïîäãðóçêà ñóùíîñòåé Ðàñïðåäåëåíèå ïîëüçîâàòåëåé íà áàêåòû (è íîäû) ÷åðåç ZooKeeper + Curator10 (Consistent Hashing11) 10http://curator.apache.org 11http://en.wikipedia.org/wiki/Consistent_hashing Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 56 / 61
  • 57. Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà Êîìïîíåíò ñåðâèñà óâåäîìëåíèé Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 57 / 61
  • 58. Ïðèìåðû ñèñòåì Èåðàðõè÷åñêàÿ îáðàáîòêà Î ÷¼ì íóæíî äóìàòü Íàáëþäàåìîñòü Ëîããèðîâàíèå Àãðåãàòíûå ãðàôèêè Ìîíèòîðèíãè Ïîâåäåíèå ïðè ïåðåãðóçêå Äåòåêòèðîâàíèå ïåðåãðóçêè Îãðàíè÷åíèå ðåñóðñîâ Ïðåâåíòèâíûé reject Âîññòàíîâëåíèå ïîñëå ïåðåãðóçêè Âûðàâíèâàíèå íàãðóçêè Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 58 / 61
  • 59. Çàêëþ÷åíèå Çàêëþ÷åíèå Ïàðàëëåëüíûå ïðîãðàììû ýòî íåèçáåæíî Íóæíû áîëåå ïðîñòûå ñïîñîáû ñîçäàíèÿ êîððåêòíûõ ïàðàëëåëüíûõ ïðîãðàììíûõ ñèñòåì Íèçêîóðîâíåâûé ïàðàëëåëèçì ýòî ÷ðåçâû÷àéíî ñëîæíî Íî åñòü àëüòåðíàòèâû12: Message-Passing Concurrency (Actor Model) Dataflow Concurrency Software Transactional Memory (STM) No Silver Bullet 12ScalaDays 2013. Concurrency The good, the bad, the ugly: http://www.parleys.com/play/51c0bc58e4b0ed877035680a/ Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 59 / 61
  • 60. Çàêëþ÷åíèå Êóäà äâèãàòüñÿ äàëüøå Êóäà äâèãàòüñÿ äàëüøå Typesafe Activator13 Reactive Manifesto14 Principles of Reactive Programming15 Êíèãè: Jamie Allen. Effective Akka. 2013 Derek Wyatt. Akka Concurrency. 2013 Series: The Neophyte’s Guide to Scala16 EAI Patterns Series17 Chris Okasaki. Purely Functional Data Structures. 1999 JCIP 2nd edition + JMM 13http://typesafe.com/activator 14http://www.reactivemanifesto.org 15https://class.coursera.org/reactive-001/class 16http://letitcrash.com/post/64667109914/ series-the-neophytes-guide-to-scala 17http://letitcrash.com/post/59190266995/ Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 60 / 61
  • 61. Âîïðîñû? Âîïðîñû? http://incubos.org/ Îáùèå âîïðîñû â Twitter: @incubos Âîïðîñû ïî ëåêöèÿì â êîììåíòàðèÿõ: http://incubos.org/blog/ ×àñòíûå âîïðîñû â ïî÷òó incubos@yandex.ru Öåñüêî Â.À. (ÑÏáÃÏÓ) Actor Model 21 íîÿáðÿ 2014 ã. 61 / 61