More Related Content More from Yuto Suzuki (20) いまさらAkkaStream1. い ま さ ら A K K A S T R E A M
C Y B E R Z Y U T O S U Z U K I
2. W H O ?
• Yuto Suzuki
• F.O.X Lead Engineer
3. D O Y O U K N O W A K K A ?
4. D O Y O U K N O W A K K A
S T R E A M ?
5. A K K A S T R E A M と は ?
Reactive StreamのAkka実装
6. – H T T P : / / W W W . R E A C T I V E - S T R E A M S . O R G /
“Reactive Stream is an initiative to provide a
standard for asynchronous stream processing with
non-blocking back pressure.”
7. – H T T P : / / W W W . R E A C T I V E - S T R E A M S . O R G /
“Reactive Streamはノンブロッキングなバックプ
レッシャーの非同期ストリーム処理のための標準
を提供するための第一歩”
9. ノ ン ブ ロ ッ キ ン グ I / O
あるリソースを複数のスレッドが利用する際に
そのリソースを相互に排他的に保護して
無期限に実行を延期できるアルゴリズム
ノンブロッキングにできるのは
I/Oのみ
気になる人はI/Oの多重化とか調べてみると
12. B A C K P R E S S U R E
受信側が送信制御を行う方式
14. A K K A S T R E A M と は
“ノンブロッキングなバックプレッシャーの
非同期ストリーム処理のためのライブラリ”
16. U S E C A S E S
• STREAM処理
• 流量制限が必要
• 処理が複雑(重いなど)
17. H O W T O I M P L E M E N T
19. こ れ ら を つ な ぎ 合 わ せ る だ け !
21. def main(args: Array[String]): Unit = {
val source: Source[Int, NotUsed] = Source(1 to 100)
val flow: source.Repr[Int] = source
.throttle(1, 1.second, 0, ThrottleMode.shaping)
flow.runForeach(println)
}
1秒の流量制限を入れる
22. def main(args: Array[String]): Unit = {
val source: Source[Int, NotUsed] = Source(1 to 100)
val flow: source.Repr[Int] = source
.buffer(10, OverflowStrategy.dropHead)
flow.runForeach(println)
}
bufferに10以上溜まったら捨てる
23. def main(args: Array[String]): Unit = {
val source: Source[Int, NotUsed] = Source(1 to 100)
val flow: source.Repr[Int] = source
.mapAsync(2)(f =>
Future { Thread.sleep(1000); f + 1 }
)
flow.runForeach(println)
}
処理を2スレッドで実行する
25. T H A N K Y O U F O R L I S T E N I N G !