Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Akka Streamsで
Actorが作成されるのを確認

Akka Streamsで
Actorが作成されるのを確認

LT駆動開発29の発表資料です。
https://github.com/LTDD/Sessions/wiki/LT%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA29

Akka Streamsでどんな風にActorが生成されていくのか気になったので、ActorSystemImpl#printTreeで出力して遊んだ話です。

http://qiita.com/eielh/items/fc8dd83989660460061a

Tomohiko Himura

September 04, 2016
Tweet

More Decks by Tomohiko Himura

Other Decks in Programming

Transcript

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

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

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

  4. Akka Streams • Akkaで実装されたReactive Streams • ストリーム処理 • back pressure

    • アクターが動かす
  5. Akka Streamsの使い方 • Source Flow Sinkを組み合わせる • RunnableGraphを構築 • Materializeする

    • -> うごきはじめる 'MPX 4PVSDF 4JOL
  6. マテリアライズすると アクターができる

  7. 確認してみよう

  8. まずはAkka

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

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

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

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

  13. ΞΫλʔ "DUPS4ZTUFN ΞΫλʔ ΞΫλʔ ΞΫλʔ ΞΫλʔ ΞΫλʔ

  14. アクターの定義 class HelloActor extends akka.actor.Actor { override def receive: Receive

    = { // receiveϝιουΛ࣮૷͢Δඞཁ͕͋Δ case _ => // Կ͔ϝοηʔδ͕͖ͨΒ println("Hello, World"); } }
  15. アクターへのメッセージ送信 • ActorRef ! メッセージ

  16. アクターへのメッセージ送信 • ActorRef ! メッセージ // Ϋϥε͔ΒPropsΛੜ੒ val HelloActorProps =

    akka.actor.Props[HelloActor] // ΞΫλʔγεςϜΛߏங val actorSystem = akka.actor.ActorSystem() // Ϣʔβ༻ͷ਌ΞΫλʔʹPropsΛݩʹΞΫλʔΛੜ੒ɻੜ੒ͨ͠ΞΫλʔͷࢀরΛฦ͢ val helloActorRef = actorSystem.actorOf(HelloActorProps) // ΞΫλʔʹ "world"ͱ͍͏ϝοηʔδΛૹ৴ helloActorRef ! "World" // HelloActorͷΠϯελϯεͰ͸ͳ͍ͷͰɺ receiveϝιου͸௚઀Α΂ͳ͍
  17. アクターの親子構造を出力 • ActorSystemImpl#printTree • package private • akka

  18. 出力してみる // 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"
  19. アクターシステムを作った直後 -> / 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
  20. 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
  21. Actor内では context.actorOfで アクターを生成できる

  22. 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) }
  23. 子が増えてる -> / 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
  24. Akka Streamsで。

  25. 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)
  26. 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はアクターをつくれる
  27. 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
  28. mapで処理を加えてみる val graph = Source.fromIterator(() => Iterator.from(0)) .map(_ * 2)

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

    .to(Sink.ignore()) ⌊VTFS-PDBM"DUPS3FGDMBTTBLLBBDUPS-PDBM"DUPS3FG1SPWJEFS(VBSEJBOTUBUVTDIJMESFO ⌊4USFBN4VQFSWJTPS3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQM4USFBN4VQFSWJTPST ⌊qPXVOLOPXOPQFSBUJPO3FQPJOUBCMF"DUPS3FGDMBTTBLLBTUSFBNJNQMGVTJOH"D
  30. アクターの数かわらず

  31. 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
  32. Sink用のActorができた HelloActorとのつなぎ

  33. 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
  34. Source用のActorができてる

  35. 全部やってみる 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
  36. mapなど複数あっても合成される

  37. まとめ

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

    • meterializeするとアクターができる