38
Akka-Streams in Production 1

Akka-Streams in Production

Embed Size (px)

Citation preview

Page 1: Akka-Streams in Production

Akka-Streams in Production

1

Page 2: Akka-Streams in Production

自己紹介

• 会社:株式会社サイバーエージェント

• 名前:來田一宣

• 仕事:アドテクスタジオ->Smalgo->サーバサイドエンジニア

• 言語:Java(5年), Scala(1年半), 他細々と

2

Page 3: Akka-Streams in Production

アドテクスタジオとは

• 色々な広告プロダクトの開発がされている部署

3

Page 4: Akka-Streams in Production

Smalgo(DSP)とは

• 成果報酬型DSP(Demand-Side Platform)

• 最大秒間6万req/secのやりとり

• 分析データ量はよくわからないくらい多い量

4

Page 5: Akka-Streams in Production

ここから本題

Page 6: Akka-Streams in Production

Akka-Streamsを さわったことある人?

Page 7: Akka-Streams in Production

Akka-Streamsとは?

• Reactive-StreamsのAkka実装

7

Page 8: Akka-Streams in Production

Reactive-Streamsとは?

• JVM上のnon-blockingでback-pressureな非同期ストリーム処理の標準仕様

8

Page 9: Akka-Streams in Production

Back Pressureとは

• Subscriberが自分が処理できる量をPublisherにリクエストを送ることで無駄なくSubscriberが処理できる量を処理する仕組みがBack pressure

9

Page 10: Akka-Streams in Production

publisher1op/s

subscriber 100op/s

問題なし

publisher100op/s

subscriber 1op/s

問題あり

10

Page 11: Akka-Streams in Production

publisher100op/s

subscriber 1op/s

①1reqいけるよ

②じゃあ1reqするね

Page 12: Akka-Streams in Production

コードで見るAkka-Streams

Page 13: Akka-Streams in Production

簡単な例①

13

Page 14: Akka-Streams in Production

簡単な例②

14

Page 15: Akka-Streams in Production

簡単な例③

15

Page 16: Akka-Streams in Production

どのようにProductionで使用したのか

Page 17: Akka-Streams in Production

実現したいこと

• キューに入ったユーザのマークデータを使ってほぼリアルタイムにIDを生成しそれをRedisに詰める

17

Page 18: Akka-Streams in Production

掻い摘むと

• キューからマークデータを取得

• マークデータからIDを生成

• IDデータをRedisに詰める

• おまけ:結果をロギング

18

Page 19: Akka-Streams in Production

普通にAkkaでやろうとすると

• キューを監視するActor

• 独自ロジックでIDをつけるActor

• Redisに詰めるActor

19

Page 20: Akka-Streams in Production

もしキューを監視するActorが遅かったら?• 問題なし(台数を増やせばいい)

20

Page 21: Akka-Streams in Production

もしIDを生成するActorが 遅かったら?• キューを監視するActorはそんな事お構いなしにIDを生成するActorに送りつづける

• 問題あり(メモリは有限バッファーのサイズには限りがある)

21

Page 22: Akka-Streams in Production

もしRedisに詰めるActorが 遅かったら?• IDを生成するActorはそんな事お構いなしに

Redisに詰めるActorに送りつづける

• 問題あり(メモリは有限バッファーのサイズには限りがある)

22

Page 23: Akka-Streams in Production
Page 24: Akka-Streams in Production

背圧制御を自分で実装するのは結構面倒

Page 25: Akka-Streams in Production

そうだAkka-Streams を使おう

Page 26: Akka-Streams in Production

Akka-Streams選定理由

• Akkaでやりたかった

• パフォーマンスを追求したかった

• 複雑にならずにシンプルにしたかった

• 技術的挑戦をしたかった

26

Page 27: Akka-Streams in Production

実装例

Page 28: Akka-Streams in Production

キューからデータを取得

28

Page 29: Akka-Streams in Production

IDを生成

29

Page 30: Akka-Streams in Production

IDをRedisにつめる

30

Page 31: Akka-Streams in Production

結果をlogging

31

Page 32: Akka-Streams in Production

これらの処理群を結合し実行

32

Page 33: Akka-Streams in Production

Fault Tolerance について

• 1.0-M4バージョンからAkka-StreamsのStream内で例外が起きた場合に全体を再起動するなどの設定が可能(Akka Streams内のActorを管理しているSupervisorのカスタマイズが可能)

33

Page 34: Akka-Streams in Production

メリット

• 簡単に背圧制御を実現することが可能

• メンテナンス性が高い(見通しが良いコード

• テストが書きやすい

• パフォーマンスが高い

34

Page 35: Akka-Streams in Production

デメリット

• まだ実験的なライブラリである

• 初期の学習コストが高い(Akkaの知識、Akka-Streamsの知識が必要)

• 複数台のサーバにまたがって処理できない(今後実装されるかも)

35

Page 36: Akka-Streams in Production

まとめ

• 今回紹介した機能以外も色々なことが可能なのでこの発表を聞いて少しでも興味が出たかたがいたら幸いです

36

Page 37: Akka-Streams in Production

サイバーエージェントのアドテクスタジオでは Scalaプログラマを絶賛募集中です

Page 38: Akka-Streams in Production

ご清聴ありがとうございました