akka-streams in production
TRANSCRIPT
![Page 1: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/1.jpg)
Akka-Streams in Production
1
![Page 2: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/2.jpg)
自己紹介
• 会社:株式会社サイバーエージェント
• 名前:來田一宣
• 仕事:アドテクスタジオ->Smalgo->サーバサイドエンジニア
• 言語:Java(5年), Scala(1年半), 他細々と
2
![Page 3: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/3.jpg)
アドテクスタジオとは
• 色々な広告プロダクトの開発がされている部署
3
![Page 4: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/4.jpg)
Smalgo(DSP)とは
• 成果報酬型DSP(Demand-Side Platform)
• 最大秒間6万req/secのやりとり
• 分析データ量はよくわからないくらい多い量
4
![Page 5: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/5.jpg)
ここから本題
![Page 6: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/6.jpg)
Akka-Streamsを さわったことある人?
![Page 7: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/7.jpg)
Akka-Streamsとは?
• Reactive-StreamsのAkka実装
7
![Page 8: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/8.jpg)
Reactive-Streamsとは?
• JVM上のnon-blockingでback-pressureな非同期ストリーム処理の標準仕様
8
![Page 9: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/9.jpg)
Back Pressureとは
• Subscriberが自分が処理できる量をPublisherにリクエストを送ることで無駄なくSubscriberが処理できる量を処理する仕組みがBack pressure
9
![Page 10: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/10.jpg)
publisher1op/s
subscriber 100op/s
問題なし
publisher100op/s
subscriber 1op/s
問題あり
10
![Page 11: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/11.jpg)
publisher100op/s
subscriber 1op/s
①1reqいけるよ
②じゃあ1reqするね
![Page 12: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/12.jpg)
コードで見るAkka-Streams
![Page 13: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/13.jpg)
簡単な例①
13
![Page 14: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/14.jpg)
簡単な例②
14
![Page 15: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/15.jpg)
簡単な例③
15
![Page 16: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/16.jpg)
どのようにProductionで使用したのか
![Page 17: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/17.jpg)
実現したいこと
• キューに入ったユーザのマークデータを使ってほぼリアルタイムにIDを生成しそれをRedisに詰める
17
![Page 18: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/18.jpg)
掻い摘むと
• キューからマークデータを取得
• マークデータからIDを生成
• IDデータをRedisに詰める
• おまけ:結果をロギング
18
![Page 19: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/19.jpg)
普通にAkkaでやろうとすると
• キューを監視するActor
• 独自ロジックでIDをつけるActor
• Redisに詰めるActor
19
![Page 20: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/20.jpg)
もしキューを監視するActorが遅かったら?• 問題なし(台数を増やせばいい)
20
![Page 21: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/21.jpg)
もしIDを生成するActorが 遅かったら?• キューを監視するActorはそんな事お構いなしにIDを生成するActorに送りつづける
• 問題あり(メモリは有限バッファーのサイズには限りがある)
21
![Page 22: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/22.jpg)
もしRedisに詰めるActorが 遅かったら?• IDを生成するActorはそんな事お構いなしに
Redisに詰めるActorに送りつづける
• 問題あり(メモリは有限バッファーのサイズには限りがある)
22
![Page 23: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/23.jpg)
![Page 24: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/24.jpg)
背圧制御を自分で実装するのは結構面倒
![Page 25: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/25.jpg)
そうだAkka-Streams を使おう
![Page 26: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/26.jpg)
Akka-Streams選定理由
• Akkaでやりたかった
• パフォーマンスを追求したかった
• 複雑にならずにシンプルにしたかった
• 技術的挑戦をしたかった
26
![Page 27: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/27.jpg)
実装例
![Page 28: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/28.jpg)
キューからデータを取得
28
![Page 29: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/29.jpg)
IDを生成
29
![Page 30: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/30.jpg)
IDをRedisにつめる
30
![Page 31: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/31.jpg)
結果をlogging
31
![Page 32: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/32.jpg)
これらの処理群を結合し実行
32
![Page 33: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/33.jpg)
Fault Tolerance について
• 1.0-M4バージョンからAkka-StreamsのStream内で例外が起きた場合に全体を再起動するなどの設定が可能(Akka Streams内のActorを管理しているSupervisorのカスタマイズが可能)
33
![Page 34: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/34.jpg)
メリット
• 簡単に背圧制御を実現することが可能
• メンテナンス性が高い(見通しが良いコード
• テストが書きやすい
• パフォーマンスが高い
34
![Page 35: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/35.jpg)
デメリット
• まだ実験的なライブラリである
• 初期の学習コストが高い(Akkaの知識、Akka-Streamsの知識が必要)
• 複数台のサーバにまたがって処理できない(今後実装されるかも)
35
![Page 36: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/36.jpg)
まとめ
• 今回紹介した機能以外も色々なことが可能なのでこの発表を聞いて少しでも興味が出たかたがいたら幸いです
36
![Page 37: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/37.jpg)
サイバーエージェントのアドテクスタジオでは Scalaプログラマを絶賛募集中です
![Page 38: Akka-Streams in Production](https://reader036.vdocuments.site/reader036/viewer/2022082215/55d1103cbb61eb4f078b482b/html5/thumbnails/38.jpg)
ご清聴ありがとうございました