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 ϑΝʔετίϯύε

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 確認してみよう

    View Slide

  8. まずはAkka

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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ϝιου͸௚઀Α΂ͳ͍

    View Slide

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

    View Slide

  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"

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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)
    }

    View Slide

  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

    View Slide

  24. Akka Streamsで。

    View Slide

  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)

    View Slide

  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はアクターをつくれる

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  30. アクターの数かわらず

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  34. Source用のActorができてる

    View Slide

  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

    View Slide

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

    View Slide

  37. まとめ

    View Slide

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

    View Slide