amakanをSidekiqに移行した

https://amakan.net/ のこの辺の改善の続き。


Sidekiq

amakanでは、Webサーバのバックグラウンドで処理を行うためにこれまでResqueを使っていたが、Sidekiqに変えた方がパフォーマンスが良くなる可能性があったので変えてみた。必要なメモリ量がかなり減ったように見える。

Sidekiqの提供するWeb UIはこんな感じ。興味本位で日本語に翻訳されたものを利用してみたけれど、言葉が直球でいい。

image

レスポンスを返した後にやりたい処理

この手の処理は普通にSidekiqを使うと実現できる。amakanではリクエスト中に本が登録されることがあるんだけど、同じ本の電子版などはレスポンスを返した後で登録される。

  1. 本が登録されたときにKindle版が無いか探す
  2. 本が登録されたときにDMM版が無いか探す

定期的にやりたい処理

この手の処理はSidekiqを使ってもそのまでは単純には実装できないので、sidekiq-scheduler というライブラリを使った。

  1. 最近新しくAmazonに登録された本をさがす
  2. 登録済みの本の情報が更新されていないか調べる

バックグラウンド処理を行うライブラリは色々あるものの、これまで利用していた resque-scheduler と使い方が似ていることや、Sidekiqが用意しているWeb UIに対応していることなどからこれを選んだ。

デプロイ

デプロイには capistrano-resque を使っていたのを capistrano-sidekiq に変更した。

ActiveJob

移行するついでに、今回はActiveJobを使うことにした。コードの変更は結構簡単で、この辺りの自分でも実装できるけど最初から付いてると嬉しい、という機能が何気に便利に使えた。

  • ActiveRecord::Baseのインスタンスを自動的にシリアライズしてくれる
  • 処理の実行前後にコールバックを登録できる

おわり

Sidekiqへの移行とPumaへの移行でメモリ使用量がかなり減ったので、サーバの数を減らせそうだった。今回は移行に合わせて開発環境にDockerを導入したので、次回はDocker化の話について書くかもしれない。