TL;DR
はじめに
株式会社KINECAでエンタメマッチングサービスを運営している@ryosk7です。
この記事はRuby on Rails Advent Calendar 2022の23日目の記事です。
Albaって?
AlbaはRuby製のJSONシリアライザです。
Ruby on Rails Advent Calendar 2022 14日目の記事にも、ちょうど作成者の@okuramasafumiさんが記事を執筆してくださってます。
Albaの特徴として、他シリアライザーよりも高速な点が挙げられます。
ベンチマーク
Comparison:
panko: 283.8 i/s
turbostreamer: 102.9 i/s - 2.76x (± 0.00) slower
alba: 102.4 i/s - 2.77x (± 0.00) slower
alba_inline: 98.7 i/s - 2.87x (± 0.00) slower
jserializer: 93.3 i/s - 3.04x (± 0.00) slower
fast_serializer: 60.1 i/s - 4.73x (± 0.00) slower
blueprinter: 53.8 i/s - 5.28x (± 0.00) slower
rails: 37.1 i/s - 7.65x (± 0.00) slower
jbuilder: 37.1 i/s - 7.66x (± 0.00) slower
primalize: 31.2 i/s - 9.08x (± 0.00) slower
jsonapi_same_format: 28.3 i/s - 10.03x (± 0.00) slower
representable: 27.8 i/s - 10.23x (± 0.00) slower
jsonapi: 27.5 i/s - 10.34x (± 0.00) slower
simple_ams: 16.9 i/s - 16.75x (± 0.00) slower
ams: 8.3 i/s - 34.36x (± 0.00) slower
こちらの記事にも書かれていますが、pankoはCで拡張されているため、純粋なRubyで書かれているAlbaはかなり健闘しているなと感じました。
弊社では主にjbuilderを使っていますが、こうやってベンチマークでみると、差が明らかです。(現在はOjを使って多少早くしています。)
Albaの特徴は他にも、拡張性の高さや、レイアウトという機能もあるので、後日試してみようと思います。
そんな、速さに特徴のあるAlbaですが、実際に本番運用で試している記事が見当たらなかったので、サービスの中でも重たいAPIに対して、
jbuilderからAlbaに置き換えてみました。
実際にリリース後、NewRelicで計測してみたので、この記事で公開します。
現在jbuilderを使っている方、速度改善を試みている方、Albaが気になっている方の参考になればと思います。
計測
結果がすごくわかりやすい!!
赤枠がリリースタイミングですが、リリースした後、大体半分くらいまで下がっています。
やはり、partialがボトルネックになっており、Albaに変えたことで改善されました。
ただし、APIの処理として巻き込まれてしまったので、NewRelic上では見辛くなってしまいました。
まとめ
Albaを導入したことにより、劇的な速度改善に繋がりました。
今回は試しに1個のAPIに絞って変更しましたが、徐々に広げていき全体的な速度改善に繋げていこうと思います。