Heroku で Sidekiq を使おうと思ったら Error fetching job: ERR max number of clients reached が出た話

Heroku で mperham/sidekiq を使おうと思ったら、 Error fetching job: ERR max number of clients reached が大量に出るようになってしまいました。

ログがいっぱいになり、Sidekiq.❨╯°□°❩╯︵┻━┻ したくなった。

エラーの原因

今回、 Heroku Redis の hobby-dev(Connection Limit: 20)を使っていました。 これの Limit を超えて接続していたのが原因でした。

接続数の計算方法

manuel.manuelles.nl

この記事がとても参考になりました。記事からの引用になりますが、 Sidekiq の接続数は下記の項目を考慮して算出する必要があります。

1. Sidekiq Client connection size
2. Sidekiq Server connection size
3. Sidekiq Server reserved connections (reserved for the Fetcher and Retrier)
4. Sidekiq concurrency size
5. Unicorn worker_process size
6. Heroku Web Dyno count
7. Heroku Worker count

The answer for all our problems could be described in the following sum:

max connections = (Heroku worker count * (concurrency + 2 reserved connections)) + (web dyno count * (client connection size * unicorn worker_process size))

おまけ

この問題の原因を調査中に、なぜか config/sidekiq.yml が読み込まれず、 concurrency が 25(default) になってしまう問題が起きました。
これは config/sidekiq.yml を↓のように書いていたのが原因でした。

concurrency: 8
test:
  db: <%= ENV['TEST_ENV_NUMBER'].to_i + 1 %>

正しくは wiki に記載のあるように、こんな感じで書きます。

---
:concurrency: 8
test:
  :db: <%= ENV['TEST_ENV_NUMBER'].to_i + 1 %>