amakanをSidekiqに移行した
https://amakan.net/ のこの辺の改善の続き。
- amakanをUnicornからPumaに移行した - ✘╹◡╹✘
- amakanでyarnを使うようにした - ✘╹◡╹✘
- amakanでRuby 2.3.3を使うようにした - ✘╹◡╹✘
- amakanを Ruby 2.3.3 から 2.4.0-preview3 に移行した - ✘╹◡╹✘
- amakanのフロントエンドを色々改善した - ✘╹◡╹✘
Sidekiq
amakanでは、Webサーバのバックグラウンドで処理を行うためにこれまでResqueを使っていたが、Sidekiqに変えた方がパフォーマンスが良くなる可能性があったので変えてみた。必要なメモリ量がかなり減ったように見える。
Sidekiqの提供するWeb UIはこんな感じ。興味本位で日本語に翻訳されたものを利用してみたけれど、言葉が直球でいい。
レスポンスを返した後にやりたい処理
この手の処理は普通にSidekiqを使うと実現できる。amakanではリクエスト中に本が登録されることがあるんだけど、同じ本の電子版などはレスポンスを返した後で登録される。
- 本が登録されたときにKindle版が無いか探す
- 本が登録されたときにDMM版が無いか探す
定期的にやりたい処理
この手の処理はSidekiqを使ってもそのまでは単純には実装できないので、sidekiq-scheduler というライブラリを使った。
- 最近新しくAmazonに登録された本をさがす
- 登録済みの本の情報が更新されていないか調べる
バックグラウンド処理を行うライブラリは色々あるものの、これまで利用していた resque-scheduler と使い方が似ていることや、Sidekiqが用意しているWeb UIに対応していることなどからこれを選んだ。
デプロイ
デプロイには capistrano-resque を使っていたのを capistrano-sidekiq に変更した。
ActiveJob
移行するついでに、今回はActiveJobを使うことにした。コードの変更は結構簡単で、この辺りの自分でも実装できるけど最初から付いてると嬉しい、という機能が何気に便利に使えた。
- ActiveRecord::Baseのインスタンスを自動的にシリアライズしてくれる
- 処理の実行前後にコールバックを登録できる
おわり
Sidekiqへの移行とPumaへの移行でメモリ使用量がかなり減ったので、サーバの数を減らせそうだった。今回は移行に合わせて開発環境にDockerを導入したので、次回はDocker化の話について書くかもしれない。