SREチームの中村です。
弊社にはtoreta-railsというトレタ全体の8割ほどのサービスのロジックが書かれているコアAPIがあります。
先日、toreta-railsのRails versionを5.2.3にバージョンアップしました。 それに続き、今週はRuby versionを2.5.1から2.6.3にバージョンアップしたのですが、CSV生成ジョブの性能向上が顕著でした。
その内容について報告します。
処理の内容
toreta-railsはSidekiqを非同期ジョブとして利用しています。以下の2つのCSV出力ジョブもSidekiq Workerとして実装しています。
顧客データCSV出力ジョブ
トレタは様々な規模の飲食店さんに利用されています。
店舗数が多い法人さんは売上を上げるために、自社の店舗に来店した顧客を分析します。そのため、トレタに溜まった顧客データをダウンロードできるようにする必要があります。
顧客データCSV出力ジョブは各法人に溜まった顧客データを各法人ごとに出力するというジョブです。
在庫データCSV出力ジョブ
トレタでは在庫データを永続化しておらず、都度計算しています。
詳細については私がRails Developers Meetup 2019にて発表した資料に載っていますので興味がある方は御覧ください。
Rails Developers Meetup 2019 で飲食店のオンライン予約の仕組みについて発表しました #railsdm - トレタ開発者ブログ
そのため、在庫データを別のサービスに投入する必要があるときは、在庫を計算してそれを様々な形式で渡すというやり方を取っています。 現状在庫データが必要なサービスはCSV形式で渡す必要があったので、そのためのジョブを作成しました。
計測結果
Ruby 2.5.1 (2019-06-04)
worker | 実行件数 | 合計実行時間(sec) | 1workerあたりの実行時間(sec) |
---|---|---|---|
顧客データCSV出力ジョブ | 1424 | 446685 | 313.68 |
在庫データCSV出力ジョブ | 198241 | 611437 | 3.08 |
Ruby 2.6.3 (2019-06-11)
worker | 件数 | 合計実行時間(sec) | 1workerあたりの実行時間(sec) | 1workerあたりの実行時間の性能比(%) |
---|---|---|---|---|
顧客データCSV出力ジョブ | 1419 | 347767 | 245.07 | 22% |
在庫データCSV出力ジョブ | 212244 | 376997 | 1.77 | 43% |
顧客データCSV出力ジョブでは22%、在庫データCSV出力ジョブではなんと43%も実行時間が早くなりました! Rubyを最新にバージョンアップすることで、DBやサーバへの負荷の軽減はもちろん、ユーザに高速に価値を提供できるようになりました。
まとめ
Rubyのバージョンアップをちゃんと行うことで、ユーザにとても良い価値を提供できるようになりました。 日頃からサービス開発を通してお世話になっているRuby開発チームの皆さん、本当にありがとうございます。