いまさらakkastream
TRANSCRIPT
いまさら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
W H O ?
• Yuto Suzuki
• F.O.X Lead Engineer
D O Y O U K N O W A K K A ?
D O Y O U K N O W A K K A
S T R E A M ?
A K K A S T R E A Mとは?
Reactive StreamのAkka実装
– 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.”
– 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はノンブロッキングなバックプレッシャーの非同期ストリーム処理のための標準
を提供するための第一歩”
聞き慣れない単語が。
ノンブロッキング I / O
あるリソースを複数のスレッドが利用する際にそのリソースを相互に排他的に保護して無期限に実行を延期できるアルゴリズム
ノンブロッキングにできるのは
I/Oのみ
気になる人はI/Oの多重化とか調べてみると
2
process
CPUtask
I/O
1
task
2
process
CPU
I/O
1
task
waiting
B A C K P R E S S U R E
受信側が送信制御を行う方式
sender receiverタスクn個受けれる
n個流すわ
A K K A S T R E A Mとは
“ノンブロッキングなバックプレッシャーの非同期ストリーム処理のためのライブラリ”
U S E C A S E S
U S E C A S E S
• STREAM処理
• 流量制限が必要
• 処理が複雑(重いなど)
H O W T O I M P L E M E N T
送信側
受信側
途中処理
これらをつなぎ合わせるだけ!
def main(args: Array[String]): Unit = {
val source: Source[Int, NotUsed] = Source(1 to 100)
source.runForeach(println)
}
ただ単に1 ~ 100を吐くだけ
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秒の流量制限を入れる
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以上溜まったら捨てる
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スレッドで実行する
デモ
T H A N K Y O U F O R L I S T E N I N G !