Slide 1

Slide 1 text

Akka StreamsͰ
 Actor͕࡞੒͞ΕΔͷΛ֬ೝ 2016-09-04 LTۦಈ։ൃ29 ϑΝʔετίϯύε

Slide 2

Slide 2 text

ͻΉΒ ͱ΋ͻ͜ ΋ͬͱӳޠ͕ΑΊΔΑ͏ʹͳΒʹΌ͍͔Μͱ ͸ࢥ͍ͬͯΔ

Slide 3

Slide 3 text

Akka StreamsͰ Actor͕Ͱ͖ΔͷΛ֬ೝ

Slide 4

Slide 4 text

Akka Streams • Akkaで実装されたReactive Streams • ストリーム処理 • back pressure • アクターが動かす

Slide 5

Slide 5 text

Akka Streamsの使い方 • Source Flow Sinkを組み合わせる • RunnableGraphを構築 • Materializeする • -> うごきはじめる 'MPX 4PVSDF 4JOL

Slide 6

Slide 6 text

マテリアライズすると アクターができる

Slide 7

Slide 7 text

確認してみよう

Slide 8

Slide 8 text

まずはAkka

Slide 9

Slide 9 text

Akka • Scala/Java • アクターモデルを実現するツールキット

Slide 10

Slide 10 text

アクターモデル • アクターにメッセージを送る • アクターはメッセージボックスにたまっ たメッセージを順番に処理

Slide 11

Slide 11 text

アクターをつくる • Actorを継承したクラスを作成 • クラスからPropsを作成 • Propsからアクターを生成 • アクターはアクターからしか生成できない

Slide 12

Slide 12 text

最初のアクター • アクターシステムをつくるときに用意される • アクターは木構造になる • アクターがつくったアクターが親アクター • つくられたアクターが子アクター

Slide 13

Slide 13 text

ΞΫλʔ "DUPS4ZTUFN ΞΫλʔ ΞΫλʔ ΞΫλʔ ΞΫλʔ ΞΫλʔ

Slide 14

Slide 14 text

アクターの定義 class HelloActor extends akka.actor.Actor { override def receive: Receive = { // receiveϝιουΛ࣮૷͢Δඞཁ͕͋Δ case _ => // Կ͔ϝοηʔδ͕͖ͨΒ println("Hello, World"); } }

Slide 15

Slide 15 text

アクターへのメッセージ送信 • ActorRef ! メッセージ

Slide 16

Slide 16 text

アクターへのメッセージ送信 • ActorRef ! メッセージ // Ϋϥε͔ΒPropsΛੜ੒ val HelloActorProps = akka.actor.Props[HelloActor] // ΞΫλʔγεςϜΛߏங val actorSystem = akka.actor.ActorSystem() // Ϣʔβ༻ͷ਌ΞΫλʔʹPropsΛݩʹΞΫλʔΛੜ੒ɻੜ੒ͨ͠ΞΫλʔͷࢀরΛฦ͢ val helloActorRef = actorSystem.actorOf(HelloActorProps) // ΞΫλʔʹ "world"ͱ͍͏ϝοηʔδΛૹ৴ helloActorRef ! "World" // HelloActorͷΠϯελϯεͰ͸ͳ͍ͷͰɺ receiveϝιου͸௚઀Α΂ͳ͍

Slide 17

Slide 17 text

アクターの親子構造を出力 • ActorSystemImpl#printTree • package private • akka

Slide 18

Slide 18 text

出力してみる // package akka val actorSystem = akka.actor.ActorSystem() // printeNodeΛ͔ͭ͏ͨΊʹແཧ໼ཧActorSystemImplʹ val as = actorSystem.asInstanceOf[ActorSystemImpl] println(as.printTree); // ΞΫλʔγεςϜΛ࡞ͬͨ࣌఺ val helloActorRef = actorSystem.actorOf(HelloActorProps) println(as.printTree); // HelloActorΛҰͭ࡞੒ helloActorRef ! "World"

Slide 19

Slide 19 text

アクターシステムを作った直後 -> / LocalActorRefProvider$$anon$1 class akka.actor.LocalActorRefProvider$Guardian s ⌊-> system LocalActorRef class akka.actor.LocalActorRefProvider$SystemGuardian st | ⌊-> deadLetterListener RepointableActorRef class akka.event.DeadLetterListene | ⌊-> eventStreamUnsubscriber-1 RepointableActorRef class akka.event.EventStrea | ⌊-> log1-Logging$DefaultLogger RepointableActorRef class akka.event.Logging$D ⌊-> user LocalActorRef class akka.actor.LocalActorRefProvider$Guardian status=0 n

Slide 20

Slide 20 text

HelloActorを作った直後 -> / LocalActorRefProvider$$anon$1 class akka.actor.LocalActorRefProvider$Guardian s ⌊-> system LocalActorRef class akka.actor.LocalActorRefProvider$SystemGuardian st | ⌊-> deadLetterListener RepointableActorRef class akka.event.DeadLetterListene | ⌊-> eventStreamUnsubscriber-1 RepointableActorRef class akka.event.EventStrea | ⌊-> log1-Logging$DefaultLogger RepointableActorRef class akka.event.Logging$D ⌊-> user LocalActorRef class akka.actor.LocalActorRefProvider$Guardian status=0 1 ⌊-> $a RepointableActorRef class akka.HelloActor status=0 no children

Slide 21

Slide 21 text

Actor内では context.actorOfで アクターを生成できる

Slide 22

Slide 22 text

class HelloActor extends akka.actor.Actor { var child: akka.actor.ActorRef = _ override def receive: Receive = { case str: String => // HelloActorͷதͰΞΫλʔΛੜ੒ child = context.actorOf(HelloActor.props) println(s"Hello, $str") } } object HelloActor { val props = akka.actor.Props[HelloActor] } object Sample extends App { val actorSystem = akka.actor.ActorSystem() val as = actorSystem.asInstanceOf[ActorSystemImpl] val helloActorRef = actorSystem.actorOf(HelloActor.props) println(as.printTree) helloActorRef ! “World” println(as.printTree) }

Slide 23

Slide 23 text

子が増えてる -> / LocalActorRefProvider$$anon$1 class akka.actor.LocalActorRefProvider$Guardian s ⌊-> system LocalActorRef class akka.actor.LocalActorRefProvider$SystemGuardian st | ⌊-> deadLetterListener RepointableActorRef class akka.event.DeadLetterListene | ⌊-> eventStreamUnsubscriber-1 RepointableActorRef class akka.event.EventStrea | ⌊-> log1-Logging$DefaultLogger RepointableActorRef class akka.event.Logging$D ⌊-> user LocalActorRef class akka.actor.LocalActorRefProvider$Guardian status=0 1 ⌊-> $a RepointableActorRef class akka.HelloActor status=0 1 children ⌊-> $a LocalActorRef class akka.HelloActor status=0 no children

Slide 24

Slide 24 text

Akka Streamsで。

Slide 25

Slide 25 text

val actorSystem = akka.actor.ActorSystem() val as = actorSystem.asInstanceOf[ActorSystemImpl] println(as.printTree) // StreamSupervisorΞΫλʔ͕ੜ੒͞ΕΔ val materializer = akka.stream.ActorMaterializer()(actorSystem) println(as.printTree) // ·ͩͳʹ΋Ͱ͖ͳ͍ val graph = Source.fromIterator(() => Iterator.from(0)).to(Sink.ignore()) println(as.printTree) // ετϦʔϜΛಈ͔ͨ͢ΊʹΞΫλʔ͕Ͱ͖Δ graph.run()(materializer) println(as.printTree)

Slide 26

Slide 26 text

val actorSystem = akka.actor.ActorSystem() val as = actorSystem.asInstanceOf[ActorSystemImpl] println(as.printTree) // StreamSupervisorΞΫλʔ͕ੜ੒͞ΕΔ val materializer = akka.stream.ActorMaterializer()(actorSystem) println(as.printTree) // ·ͩͳʹ΋Ͱ͖ͳ͍ val graph = Source.fromIterator(() => Iterator.from(0)).to(Sink.ignore()) println(as.printTree) // ετϦʔϜΛಈ͔ͨ͢ΊʹΞΫλʔ͕Ͱ͖Δ graph.run()(materializer) println(as.printTree) run されるまではmaterializerが必要ない materializerはActorSystemをもってる materializerはアクターをつくれる

Slide 27

Slide 27 text

NBUFSJBMJ[FSੜ੒લ ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTOPDIJME NBUFSJBMJ[FSੜ੒ޙ ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMES ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTP άϥϑੜ੒ޙ ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMES ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTP SVO࣮ߦޙ ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMES ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPS ⌊qPXVOLOPXOPQFSBUJPO3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQMGVTJOH

Slide 28

Slide 28 text

mapで処理を加えてみる val graph = Source.fromIterator(() => Iterator.from(0)) .map(_ * 2) .to(Sink.ignore())

Slide 29

Slide 29 text

mapで処理を加えてみる val graph = Source.fromIterator(() => Iterator.from(0)) .map(_ * 2) .to(Sink.ignore()) ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMESFO ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPST ⌊qPXVOLOPXOPQFSBUJPO3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQMGVTJOH"D

Slide 30

Slide 30 text

アクターの数かわらず

Slide 31

Slide 31 text

Sink.actorRefを利用 val helloActor = actorSystem.actorOf(HelloActor.props) val graph = Source.fromIterator(() => Iterator.from(0)) .map(_.toString) .to(Sink.actorRef[String](helloActor, ())) ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMESFO ⌊B3FQPJOUBCMF"DUPS3FGDMBTTBLLB)FMMP"DUPSTUBUVTOPDIJMESFO ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPSTUBUVT ⌊qPXVOLOPXOPQFSBUJPO3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQMGVTJOH"DUPS(S ⌊qPXBDUPS3FG4JOL3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM"DUPS3FG4JOL"DUPSTU

Slide 32

Slide 32 text

Sink用のActorができた HelloActorとのつなぎ

Slide 33

Slide 33 text

Source.actorRefをつかってみる val helloActor = actorSystem.actorOf(HelloActor.props) val graph = Source.actorRef(1, OverflowStrategy.dropTail) .to(Sink.actorRef[String](helloActor, ())) ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMESFO ⌊B3FQPJOUBCMF"DUPS3FGDMBTTBLLB)FMMP"DUPSTUBUVTOPDIJMESFO ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPSTUBUVT ⌊qPXBDUPS3FG4PVSDF3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM"DUPS3FG4PVSDF"D ⌊qPXBDUPS3FG4JOL3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM"DUPS3FG4JOL"DUPSTU

Slide 34

Slide 34 text

Source用のActorができてる

Slide 35

Slide 35 text

全部やってみる val graph = Source.actorRef[Int](1, OverflowStrategy.dropTail) .map(_*2) .map(_.toString) .to(Sink.actorRef[String](helloActor, ())) ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMESFO ⌊B3FQPJOUBCMF"DUPS3FGDMBTTBLLB)FMMP"DUPSTUBUVTOPDIJMESFO ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPSTUBUVT ⌊qPXVOLOPXOPQFSBUJPO3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQMGVTJOH"DUPS(SBQI ⌊qPXBDUPS3FG4PVSDF3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM"DUPS3FG4PVSDF"DUP ⌊qPXBDUPS3FG4JOL3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM"DUPS3FG4JOL"DUPSTUBUV

Slide 36

Slide 36 text

mapなど複数あっても合成される

Slide 37

Slide 37 text

まとめ

Slide 38

Slide 38 text

まとめ • AkkaではまずActorSystemをつくる • アクターは親子構造がある • アクターからアクターをつくる • Akka streamsでは • meterializeするとアクターができる