テクノロジー戦略本部の市田です。
普段の業務では社内基幹システムのAXISの開発を主に行っています。
AXISグループでは最近APIの速度改善に取り組みましたので、使った技術や改善までの流れを紹介します。
AXISグループについて知りたい方は以下の記事を参考にしてください。
経緯
AXISがリリースされてから2年ほど経ち、数百万レコードのデータが存在するテーブルが出てきて、明らかに処理が遅い機能が増えてきました。時には処理が終わるまで数十秒かかることもあり、ユーザの業務に大きな影響が出ていました。
そこで私たちはユーザが効率よく業務が進められるようにAPIの速度改善を行うことにしました。
改善すべきAPIを見つける
まずは、速度改善を行う必要のあるAPIを洗い出すことにしました。そこで使ったのがNewRelicというSaaSです。
AXISはバックエンドでRuby on Railsを使っていますが、RailsでNewRelicを使うにはgemのnewrelic_rpmを導入すると簡単です。
NewRelicを使えばAPIの応答時間やリクエスト数などを可視化することができます。上記のgemを導入すると本番環境や開発環境用のサイトが作られ、ブラウザ上でAPIの分析ができます。
以下の棒グラフでは「あるAPIの1日の合計応答時間が全APIの1日の合計応答時間の何%を占めているか」を知ることができます(APIの詳細はぼかして見えなくしています)。このグラフの上位のAPIは簡単に言えば「何回もリクエストされるし、処理が終わるまで遅い」ということです。
ということで、このグラフの上位のAPIを改善することにしました。
ちなみに、別の画面ではリクエスト数・平均応答時間・最大応答時間・合計応答時間などを表で見ることもできます。csvでダウンロードもできるので、独自の分析をしたい時にも便利ですね。
遅い原因を突き止め、対応策を決める
さて、対象のAPIが決まったので原因を調べ、どう改善していくのかを決めます。
NewRelicでは一定時間より遅いリクエストの詳細な分析を見ることができます。以下はあるAPIの特に遅いリクエストの一覧です。1回7秒以上かかっているリクエストがありますね...
詳細を見ると、応答時間の内訳がグラフで表示されます。ぼかしている箇所には「controller名#アクション名」や「 DBMS名(PostgreSQLやMySQLなど)+テーブル名+処理」が表示されています。このリクエストは何百回もfind(SQLでいうとSELECT)が実行されているので、N+1問題が発生していることが分かります。
また、「どのクエリが何回実行され合計何秒かかっているのか」も見ることができます。
リクエストで発生したクエリ一覧
さて、N+1問題が発生しているのが遅い原因だと分かりました。あとは、ローカルで同じAPIを実行してみて、コードのどの箇所でN+1問題が発生しているのかログを見たりコードを読んだりして突き止めて対応策を決定します。その辺は以下の記事を参考にしてください。
まとめ
このようにして分析を行い対応策を実行しました。結果として、約55時間/月の応答時間を削減することができ、ユーザにも感謝の声をいただきました。
ユーザは待ち時間が減り、その分だけ別の仕事をすることができるので会社にとってもよいことですし、エンジニアにとっても遅いAPIを速くすることは楽しくやりがいがあることだと思います。
最後にバイセルテクノロジーズではエンジニアを募集しています。
もし興味をお持ちいただけましたらぜひご応募ください!