Sidekiq を使うとき、ActiveRecord のコネクションプール数 >= Sidekiq のスレッド数 + 1 にするのが良さそう
以下の記事に書かれていたことそのままだが備忘としてまとめた。
- ActiveRecord のコネクションプールは、各 Sidekiq ワーカスレッドと そのスレッドが動作するプロセス(Sidekiq プロセス) に一つずつ割り当てられる
- Sidekiq の並列数(ワーカスレッド数)と、コネクションプール上限数が等しいとき、ワーカスレッドに割り当てられるはずのプールが一つ不足する(Sidekiq プロセスに一つ割り当てられるため)
- この状態でかつ、database.yml の
checkout_timeout
に設定した秒数(デフォルトは 5 秒)以上かかるジョブを実行する場合- 2 つのワーカスレッドに処理を割り当てると、片方のワーカスレッドはコネクションを取得できるので処理が実行できる
- しかし、もう片方のワーカスレッドは、はじめのワーカスレッドと Sidekiq プロセスによってコネクションプールに空きがないため、
checkout_timeout
秒以内にコネクションを取得できず、ジョブの実行に失敗する
- したがって、ActiveRecord のコネクションプール数は、ワーカスレッド数 + 1 以上にするのが適切である
以上!