Sidekiq を使うとき、ActiveRecord のコネクションプール数 >= Sidekiq のスレッド数 + 1 にするのが良さそう

以下の記事に書かれていたことそのままだが備忘としてまとめた。

repl.info

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

以上!