adtech studio

Akka Throttlerのチュートリアル

By yusuke

Akka AMoAd

こんにちは。AMoAdでエンジニアをやっております、西部と申します。

今回は、AMoAdで外部APIを呼んだ時に便利だったAkkaのThrottlerのチュートリアル的な話をしたいと思います。
Akkaってなんぞ?という方は以下の記事をぜひ読んでみてください。

【Akka入門の入門】Part.1 メッセージを送る
【Akka入門の入門】Part.2 アクター子アクター孫アクター

 
外部API使用する場合、QPSの制限があるケースがありますよね。
この上限ギリギリまでアクセスしたいという場合にThrottlerは威力を発揮します。

 
簡単な例でご紹介しましょう。3QPSに抑えるケースです。

sbt

code

結果

今回は文字列を出力するだけですが、PrintActorを入れ替えて外部APIにアクセスすればOKという感じですね。
3行ずつ出力されることが分かるかと思います。

 
続いて、今回使用しているTimerBasedThrottlerのテストを書いてみましょう。

実行するとテストが通ることが分かると思います。

 
TimerBasedThrottlerは、引数で受け取ったrateとmessage queueを内部的に保持しており、
rateの期間制限いっぱいまでqueに溜まった内容を処理し、queに処理が残れば次の期間に回すというシンプルな実装になっています。

図にすると以下のような感じです。

スクリーンショット 2016-07-21 23.08.32

 
 
TimerBasedThrottlerはシンプルであるが故に以下の注意点があります。
① 開始時間のみを考慮するため、APIを受けるサーバの応答が遅い場合はサーバ側のQPS計測と乖離する可能性がある
② TimerBasedThrottler独自の間隔を使用するので、間隔の取り方によっては制限を超える可能性がある

図にすると以下のようになります。

スクリーンショット 2016-07-27 21.26.45

スクリーンショット 2016-07-27 22.01.00
タイミングがシビアなケースではTimerBasedThrottlerを拡張するなどの対応が必要かもしれませんね。

 
 
と、これだけでは寂しいので、少しだけ発展として以下のケースを考えてみます。
・APIで取得した値を使用して、さらにリクエストを送りたい
・ただし、QPSの合計が3QPSに収まっている必要がある

やりようは色々とあると思いますが、単純にThrottlerを使い回すやり方を紹介します。

code

実行してみると、以下のような出力になると思います。

というわけで、今回はThrottlerのチュートリアルということで解説と簡単な実装を紹介しました。
あまり日本語の情報がないみたいなので参考にしていただけると幸いです。