SlideShare a Scribd company logo
1 of 25
い ま さ ら 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 !

More Related Content

More from Yuto Suzuki

More from Yuto Suzuki (20)

エンジニアのためのマーケティング
エンジニアのためのマーケティングエンジニアのためのマーケティング
エンジニアのためのマーケティング
 
How to Build a Team
How to Build a TeamHow to Build a Team
How to Build a Team
 
プロダクトにおけるScala
プロダクトにおけるScalaプロダクトにおけるScala
プロダクトにおけるScala
 
Do you like scala
Do you like scalaDo you like scala
Do you like scala
 
Re invent
Re inventRe invent
Re invent
 
Slackから始めるChatOps
Slackから始めるChatOpsSlackから始めるChatOps
Slackから始めるChatOps
 
大学の時の研究の話
大学の時の研究の話大学の時の研究の話
大学の時の研究の話
 
F.O.Xを支える技術
F.O.Xを支える技術F.O.Xを支える技術
F.O.Xを支える技術
 
Scala戦士を増やせ
Scala戦士を増やせScala戦士を増やせ
Scala戦士を増やせ
 
Recommend scala
Recommend scalaRecommend scala
Recommend scala
 
スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方スクラムに学ぶ開発の回し方
スクラムに学ぶ開発の回し方
 
Breezeで始めるデータ分析
Breezeで始めるデータ分析Breezeで始めるデータ分析
Breezeで始めるデータ分析
 
進撃のSbt
進撃のSbt進撃のSbt
進撃のSbt
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
Deeplearningとは?
Deeplearningとは?Deeplearningとは?
Deeplearningとは?
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
 
Git LFSを触ってみた
Git LFSを触ってみたGit LFSを触ってみた
Git LFSを触ってみた
 
実戦Scala
実戦Scala実戦Scala
実戦Scala
 
Api設計
Api設計Api設計
Api設計
 
Emacs
EmacsEmacs
Emacs
 

いまさらAkkaStream

  • 1. い ま さ ら 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はノンブロッキングなバックプ レッシャーの非同期ストリーム処理のための標準 を提供するための第一歩”
  • 8. 聞 き 慣 れ な い 単 語 が 。
  • 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 と は “ノンブロッキングなバックプレッシャーの 非同期ストリーム処理のためのライブラリ”
  • 15. U S E C A S E S
  • 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. こ れ ら を つ な ぎ 合 わ せ る だ け !
  • 20. def main(args: Array[String]): Unit = { val source: Source[Int, NotUsed] = Source(1 to 100) source.runForeach(println) } ただ単に1 ~ 100を吐くだけ
  • 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 !