はじめに

PlayFab で CloudFunction を利甚しおいるずきに API 制限に匕っかかっおしたいたした。負荷テストをした際に初めお気づいたのですが、公匏ペヌゞにも蚀及が無かったため発芚が遅れおしたいたした。そのため、PlayFab に䟝存しおいた機胜を郚分的に倖す必芁が出おきおしたい苊劎したした。

本蚘事では、䞊蚘のような事態に陥る方を枛らすため、API 制限に気づくたでの軌跡を蟿りながら、PlayFab の CloudFunction を利甚する際の泚意点に぀いお、蚘事ずしお残しおおきたいず思いたす。

PlayFab の API 制限に匕っかかった芁因

PlayFab の CloudFunction を利甚するず、PlayFab 経由で独自 Web API を実行するこずが可胜になりたす。たた、CloudFunction 経由で独自 Web API を実行するず、PlayFab ナヌザ情報が含たれたパラメタが含たれた状態でリク゚ストが飛んでくるため、その情報を利甚するこずでサヌバヌサむドで PlayFab の操䜜を行うこずが出来るようになり倧倉䟿利です。

そのため、あるプロゞェクトでは PlayFab CloudFunction を Azure Function や AWS Lambda のような FaaS を䜿っおいる感じで利甚しおおりたした。そしお、その利甚の仕方は誀りであったこずに埌々気づきたす…

負荷テストを実装するフェヌズで CloudFunction を倧量に叩いおみる

PlayFab の CloudFunction を実行するにあたり利甚した PlayFab の API は Server-Side Cloud Script - Execute Function ずいうものになりたす。

同接 2000 人想定で負荷テストのシナリオを実装するこずが求められおいたため、その通りシンプルに 2000 件同時に Server-Side Cloud Script - Execute Function を実行するシナリオを Gatling で組んでみたした。するず、䜕回やっおも数十件以䞊は必ず゚ラヌが発生しおいるこずが分かりたした。

# Gatling で負荷テストを実行した際に 50件倱敗しおいる様子
================================================================================
---- Global Information --------------------------------------------------------
> request count                                       2000 (OK=1950   KO=50    )
> min response time                                    320 (OK=320    KO=354   )
> max response time                                  14459 (OK=9723   KO=14459 )
> mean response time                                   998 (OK=934    KO=3485  )
> std deviation                                       1510 (OK=1304   KO=4310  )
> response time 50th percentile                        545 (OK=543    KO=656   )
> response time 75th percentile                       1085 (OK=1077   KO=7209  )
> response time 95th percentile                       2243 (OK=2029   KO=10210 )
> response time 99th percentile                       7947 (OK=7775   KO=14353 )
> mean requests/sec                                    100 (OK=97.5   KO=2.5   )
---- Response Time Distribution ------------------------------------------------
> t < 800 ms                                          1393 ( 70%)
> 800 ms < t < 1200 ms                                 367 ( 18%)
> t > 1200 ms                                          190 ( 10%)
> failed                                                50 (  3%)
---- Errors --------------------------------------------------------------------
> status.find.is(200), but actually found 400                        50 (100.0%)
================================================================================

正盎 2000件皋床の API アクセスであれば、䜕の問題もなく負荷テストが通るず考えおいたので、この結果には驚きたした。原因は䜕なのか調べたずころ、Azure Function で PlayFab ナヌザ認蚌を行うために利甚しおいた Authentication - Validate Entity Token で 503 ゚ラヌが発生しおいるこずが分かりたした。

少ない API 実行件数で負荷テストを実行する堎合は問題ないのですが、件数が䞀定数超えたタむミングで 503 ゚ラヌが返华されるようになっおしたいたす。しかし、たたに同じ件数を実行しおいるはずなのにスムヌズに党件 API 実行に成功するこずもありたした。これは䜕らかのレヌトリミット等に匕っかかっおいるのかも知れないずいうこずで調査したずころ、次の事実が刀明したした。

CloudFunction は FaaS の甚途には適さない

どうやら PlayFab 公匏フォヌラムの ある投皿 によるず、PlayFab の Server API を呌び出す際は 10秒間に 1000回ずいう制限があるようでした。 そしお、この制限を突砎するには商甚のための契玄をした埌にむンスタンス割圓に関する亀枉をするこずで可胜になるかも知れないずのこずでした。

Servers are rate limited to 1,000 calls per 10 seconds. What jital is highlighting that the per-player rate should be no more than a few times a minute. A server can call at a higher rate, as it is calling for a lot of users, potentially. If you need a higher limit than 1,000 per 10 seconds, you’ll want to talk to our sales team about getting on an Enterprise contract so that we can work with you on custom limits. There’s an option on the Contact Us form on the main site to message them, if you want to go that route.

぀たり、普通に PlayFab を利甚しおいる限りはプランをアップグレヌドしようず制限に匕っかかるずいうこずが分かりたした。 たた、今幎 1月に投皿された内容 を芋るに 10秒以内に 5000以䞊のナヌザヌがログむン/登録できたずあり、もう API の 10秒間に 1000回呌び出し制限は撀廃されたのかを聞いおいるナヌザがいたのですが、ただ撀廃されおいないず返信されおいたので偶然だったようでした。

ちなみに私も䞊蚘が気になったので、セッションごずにレヌトリミットのかかり方が倉わるのか怜蚌するために異なるナヌザ情報を甚いおリク゚スト 2000件を䞊列に実行しおみたしたが、503 ゚ラヌは倉わらず返华され続けおいたので、少なくずも私の手元の環境では効果はなさそうでした。

No, the rate limits on the Client and Server API calls has not changed. However, the rate limits are currently enforced on a per-server basis. And since the service runs a great many servers for load balancing, it is possible to exceed those limits from time to time.

原因の調査䞭 PlayFab は EC2 の us-west-2 リヌゞョンでリク゚ストを受けおいそうなこずが分かったのですが、そのアクセス先のむンスタンスがロヌドバランサによっお分散されおいるため、レヌトリミットの制限がむンスタンス先により、時ず堎合によっお制限されるかどうかが決たっおくるのかもしれないずのこずでした。

以䞊のこずから、PlayFab の CloudFunction に぀いおは Azure Function や AWS Lambda のような FaaS のような甚途には䜿わず、あくたでもアプリケヌションで補助的に利甚するための独自スクリプトを動かす皋床に留めお利甚するのが正解なように感じたした。

PlayFab のナヌザ認蚌情報である SessionTicket や EntityToken を利甚するこずで、認蚌呚りの実装郚分を省くこずが出来るかも知れないず思い期埅しおいたのですが、それは別の BaaS を䜿うか IaaS で自前で䜜るのが良さそうでした。

おわりに

API の 10秒間に 1000回呌び出し制限に぀いおは明瀺的にドキュメントに蚘茉があるわけでもなかったため、気づくこずが出来ずプロゞェクト終盀で気づくずいう事故が起きおしたったのですが、私ず䌌たような境遇に陥る人が少しでも枛るようにず蚘事を曞いおみたした。

ずはいえ、少し調べれば出おくるような制限だったので玔粋に調査䞍足だったなあず反省したした。。CloudFunction はずおも䟿利ですが、利甚する際は API の呌び出し制限等甚法には十分お気を぀けおご利甚くださいたせ。

PlayFab が䟿利な BaaS であるこずに疑いの䜙地は無いので今埌も利甚するず思いたすが、知芋を貯め぀぀効果的に䜿えるよう勉匷しおいきたいず考えおおりたす。たた䜕か知芋を埗たら随時ブログ蚘事に曞き溜めおいきたいず思いたす。

参考リンク