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

Akka StreamのDelayで学ぶback-pressure

Akka StreamのDelayで学ぶback-pressure

Tomohiko Himura

August 08, 2016
Tweet

More Decks by Tomohiko Himura

Other Decks in Programming

Transcript

  1. ストリーム処理のパイプライ ンを表現する部品 • Source • 一つの出力をもつ処理単位 • Flow • 1つの入力と1つの出力をもつ処理単位

    • Sink • 1つの入力を持つ処理単位 • RunnableGraph • 入力も出力もない。実行できる状態。 4PVSDF 4JOL 'MPX
  2. 数字を数え続けてみる import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Flow, Sink, Source} implicit

    val actorSystem: ActorSystem = ActorSystem() implicit val materialize: ActorMaterializer = ActorMaterializer() val source = Source.fromIterator(() => Iterator.from(0)) // ਺஋͕0͔Βॱ൪ʹྲྀΕͯ͘Δ var sink = Sink.foreach[Int](println) // ೖྗΛը໘ʹग़ྗ͢Δ source.runWith(sink) // sourceͱsinkΛ͚ͬͭͯ͘RunnableGraphΛͭͬͯ͘ɺrun͢Δ
  3. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14
  4. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 10263496 21548994 33401491 45739489 56124486 67109484
  5.   ʜ QSJOUMO 'MPX 4PVSDF 4JOL ඵ଴ͭ  

                  
  6.   ʜ QSJOUMO 'MPX 4PVSDF 4JOL ඵ଴ͭ  

                   ϝϞϦ͕͍ͬͺ͍ʹͳ Βͳ͍Α͏ʹҰ൪ޙΖ ͕ࣺͯΒΕΔ 
  7.   ʜ QSJOUMO 'MPX 4PVSDF 4JOL ඵ଴ͭ  

                  
  8. import akka.actor.ActorSystem import akka.stream.ActorMaterializer import akka.stream.scaladsl.{Flow, Sink, Source} import scala.concurrent.duration._

    def materializer(size: Int) = { ActorMaterializer(ActorMaterializerSettings(actorSystem).withInputBuffer(in itialSize = size, maxSize = size)) } implicit val actorSystem: ActorSystem = ActorSystem() implicit val materialize: ActorMaterializer = ActorMaterializer() val source = Source.fromIterator(() => Iterator.from(0)) var sink = Sink.foreach[Int](println) source.delay(1 second).runWith(sink)(materializer(8)) // bufferSize 8
  9. 0 1 2 3 4 5 6 8670996 19224994 29654491

    40506989 50808986 61550484 72043481
  10. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18
  11. source.throttle(1, 1 second, 1, ThrottleMode.Shaping).runWith(sink) 第1引数 第2引数で指定する期間内で出力される要素数 第2引数 期間 第3引数

    第4引数がEnforcingの時つかう 第4引数 上流からのデータが早いときのモード * Enforcing * Shaping
  12. 0 1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 17 18
  13. まとめ • Akka Streamは並行処理するのに • 高抽象 • そこそこ一般性がある • Akka

    Streamはback pressureできる • delayで遊んでみると体験しやすかった