Slide 1

Slide 1 text

AkkaStreamsを ちゃんと理解して高速化した話 2021/10/11 1

Slide 2

Slide 2 text

自己紹介 今月から悲願のテレビCM放映中! 求人検索エンジン 樋口直人 エンジニア Scala AWS 2

Slide 3

Slide 3 text

今日話すこと - AkkaStreamsを使おうとしたきっかけ - AkkaStreamsの構成 - AkkaStreamsで速度が出ずにハマった点とどうやって改善したか - AkkaStreamsを使って良かった点 3

Slide 4

Slide 4 text

AkkaStreamsを使おうとしたきっかけ - プロダクト開発のメイン言語がScala - 大量の求人に対して様々な加工を行うのでストリーム系フレームワークを使いたい 4 加工 大量の求人 加工 加工 保存

Slide 5

Slide 5 text

AkkaStreamsの構成 5 Source Sink Flow Flow Flow

Slide 6

Slide 6 text

AkkaStreamsで速度が出ずにハマった点 mapAsyncに設定した並列度で処理が並列化されず全体として速度が遅い 6 Source Sink Flow Flow Flow 32並列を指定しても、実際は 5並列以下で動作している。 CPUはとても余っているのになぜ?

Slide 7

Slide 7 text

改善点(1. httpClientの変更) 7 Source Sink Flow Flow Flow httpClientであるsttpのバックエンドにOkHttpを使用していたが、Featureが返ってきてたもののどうもブロッ クキングされていたようだ。 バックエンドをAsyncHttpClientに変更することで大きく改善した。

Slide 8

Slide 8 text

改善点(2. dispatcherに充分なスレッドを割り当て) 8 Source Sink Flow Flow Flow dispatcher-1 dispatcher-2 dispatcher-3 Flowごとにactorのdispatcher(fork-join-executor)を分けていたが、kamonでスレッド数を確認すると設定値 が小さく足りていなかったようだ。 充分な量のスレッドが生成されるようにした

Slide 9

Slide 9 text

改善点(3.非同期境界に充分な量のバッファを割り当て) 9 Source Sink Flow Flow Flow 各Flowに.asyncをつけると非同期境界ができ、間にバッファができ、 Actorを分離できる。 ただし、バッファのデフォルト値が 16なので、それ以上の並列度が必要な場合は設定値を上げる。 buffer 16 buffer 16

Slide 10

Slide 10 text

改善点(4.Flow内の要素の処理順序を無視する) 10 mapAsyncを使用すると要素の処理順を保持するため、時間のかかる要素があると Flow内で待ちが発生し てしまう。 mapAsyncUnorderdを用いると順序を無視して処理が終わった要素から後ろに流れるようになる。 1 2 3 4 5 6 7 8 7 8 1 2 5 6 3 4

Slide 11

Slide 11 text

AkkaStreamsを使って良かった点 - 自動でバックプレッシャーが走りFlowの制御をしてくれるので、実装したり意識した りする箇所がかなり減る。 - Graphをそのままコード上で表現できるので直感的。 11

Slide 12

Slide 12 text

AkkaStreamsを用いて、設定した並列度通りに動作する高速で安定したストリーム環境 が作れました! AkkaStreamsの思想としてEasyよりもSimpleを目指しているようなので、慣れるまでは 少し大変でしたが、とても便利で使いやすいです! 12 完