いまさらakkastream

25
いまさら AKKA STREAM CYBERZ YUTO SUZUKI

Upload: yuto-suzuki

Post on 21-Jan-2018

100 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: いまさらAkkaStream

いまさら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

Page 2: いまさらAkkaStream

W H O ?

• Yuto Suzuki

• F.O.X Lead Engineer

Page 3: いまさらAkkaStream

D O Y O U K N O W A K K A ?

Page 4: いまさらAkkaStream

D O Y O U K N O W A K K A

S T R E A M ?

Page 5: いまさらAkkaStream

A K K A S T R E A Mとは?

Reactive StreamのAkka実装

Page 6: いまさらAkkaStream

– 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.”

Page 7: いまさらAkkaStream

– 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はノンブロッキングなバックプレッシャーの非同期ストリーム処理のための標準

を提供するための第一歩”

Page 8: いまさらAkkaStream

聞き慣れない単語が。

Page 9: いまさらAkkaStream

ノンブロッキング I / O

あるリソースを複数のスレッドが利用する際にそのリソースを相互に排他的に保護して無期限に実行を延期できるアルゴリズム

ノンブロッキングにできるのは

I/Oのみ

気になる人はI/Oの多重化とか調べてみると

Page 10: いまさらAkkaStream

2

process

CPUtask

I/O

1

task

Page 11: いまさらAkkaStream

2

process

CPU

I/O

1

task

waiting

Page 12: いまさらAkkaStream

B A C K P R E S S U R E

受信側が送信制御を行う方式

Page 13: いまさらAkkaStream

sender receiverタスクn個受けれる

n個流すわ

Page 14: いまさらAkkaStream

A K K A S T R E A Mとは

“ノンブロッキングなバックプレッシャーの非同期ストリーム処理のためのライブラリ”

Page 15: いまさらAkkaStream

U S E C A S E S

Page 16: いまさらAkkaStream

U S E C A S E S

• STREAM処理

• 流量制限が必要

• 処理が複雑(重いなど)

Page 17: いまさらAkkaStream

H O W T O I M P L E M E N T

Page 18: いまさらAkkaStream

送信側

受信側

途中処理

Page 19: いまさらAkkaStream

これらをつなぎ合わせるだけ!

Page 20: いまさらAkkaStream

def main(args: Array[String]): Unit = {

val source: Source[Int, NotUsed] = Source(1 to 100)

source.runForeach(println)

}

ただ単に1 ~ 100を吐くだけ

Page 21: いまさらAkkaStream

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秒の流量制限を入れる

Page 22: いまさらAkkaStream

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以上溜まったら捨てる

Page 23: いまさらAkkaStream

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スレッドで実行する

Page 24: いまさらAkkaStream

デモ

Page 25: いまさらAkkaStream

T H A N K Y O U F O R L I S T E N I N G !