Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AkkaStreamsをちゃんと理解して高速化した話.pdf
Search
nhiguchi
October 19, 2021
Programming
440
0
Share
AkkaStreamsをちゃんと理解して高速化した話.pdf
nhiguchi
October 19, 2021
Other Decks in Programming
See All in Programming
AgentCore Optimizationを始めよう!
licux
3
230
My daily life on Ruby
a_matsuda
3
290
Structured Concurrency, Scoped Values and Joiners in the JDK 25 26 27
josepaumard
1
150
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
2
1.7k
GitHubCopilotCLIをはじめよう.pdf
htkym
0
330
サプライチェーン攻撃対策「層を重ねて落ちない壁」を10日間で組み上げた話 #TechLeadConf2026
kashewnuts
1
250
Spec-Driven Development with AI Agents (Workshop, May 2026)
antonarhipov
3
340
20260514_its_the_context_window_stupid.pdf
heita
0
920
決定論 vs 確率論:Gemini 3 FlashとTF-IDFを組み合わせた「法規判定エンジン」の構築
shukob
0
160
Road to RubyKaigi: Play Hard(ware)
makicamel
1
570
Import assertionsが消えた日~ECMAScriptの仕様はどう決まり、なぜ覆るのか~
bicstone
2
180
【ディップ|26年新卒研修資料】TDD実装演習
dip_tech
PRO
0
180
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
180
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
500
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
350
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
370
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Side Projects
sachag
455
43k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
130
Believing is Seeing
oripsolob
1
120
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Cost Of JavaScript in 2023
addyosmani
55
9.9k
Transcript
AkkaStreamsを ちゃんと理解して高速化した話 2021/10/11 1
自己紹介 今月から悲願のテレビCM放映中! 求人検索エンジン 樋口直人 エンジニア Scala AWS 2
今日話すこと - AkkaStreamsを使おうとしたきっかけ - AkkaStreamsの構成 - AkkaStreamsで速度が出ずにハマった点とどうやって改善したか - AkkaStreamsを使って良かった点 3
AkkaStreamsを使おうとしたきっかけ - プロダクト開発のメイン言語がScala - 大量の求人に対して様々な加工を行うのでストリーム系フレームワークを使いたい 4 加工 大量の求人 加工 加工
保存
AkkaStreamsの構成 5 Source Sink Flow Flow Flow
AkkaStreamsで速度が出ずにハマった点 mapAsyncに設定した並列度で処理が並列化されず全体として速度が遅い 6 Source Sink Flow Flow Flow 32並列を指定しても、実際は 5並列以下で動作している。
CPUはとても余っているのになぜ?
改善点(1. httpClientの変更) 7 Source Sink Flow Flow Flow httpClientであるsttpのバックエンドにOkHttpを使用していたが、Featureが返ってきてたもののどうもブロッ クキングされていたようだ。
バックエンドをAsyncHttpClientに変更することで大きく改善した。
改善点(2. dispatcherに充分なスレッドを割り当て) 8 Source Sink Flow Flow Flow dispatcher-1 dispatcher-2
dispatcher-3 Flowごとにactorのdispatcher(fork-join-executor)を分けていたが、kamonでスレッド数を確認すると設定値 が小さく足りていなかったようだ。 充分な量のスレッドが生成されるようにした
改善点(3.非同期境界に充分な量のバッファを割り当て) 9 Source Sink Flow Flow Flow 各Flowに.asyncをつけると非同期境界ができ、間にバッファができ、 Actorを分離できる。 ただし、バッファのデフォルト値が
16なので、それ以上の並列度が必要な場合は設定値を上げる。 buffer 16 buffer 16
改善点(4.Flow内の要素の処理順序を無視する) 10 mapAsyncを使用すると要素の処理順を保持するため、時間のかかる要素があると Flow内で待ちが発生し てしまう。 mapAsyncUnorderdを用いると順序を無視して処理が終わった要素から後ろに流れるようになる。 1 2 3 4
5 6 7 8 7 8 1 2 5 6 3 4
AkkaStreamsを使って良かった点 - 自動でバックプレッシャーが走りFlowの制御をしてくれるので、実装したり意識した りする箇所がかなり減る。 - Graphをそのままコード上で表現できるので直感的。 11
AkkaStreamsを用いて、設定した並列度通りに動作する高速で安定したストリーム環境 が作れました! AkkaStreamsの思想としてEasyよりもSimpleを目指しているようなので、慣れるまでは 少し大変でしたが、とても便利で使いやすいです! 12 完