💭

Sidekiq7への更新時にRedis Cloudを使っていてハマったこと

2024/05/29に公開

はじめに

RailsのSIdekiqを7系に更新しようとした時に、ハマったことがあったので、これから同じことをする人のために記事を書いておきます。

前提

  • Sidekiq6から7への更新
  • Heroku環境でRailsを動作
  • HerokuアドオンのRedis Cloudを使用

1. Redis CloudでRESP3に設定する

Sidekiq7は、redis-client gemに依存しており、redis-clientはRedisのRESP3プロトコルに対応しています。

https://github.com/sidekiq/sidekiq/blob/main/docs/7.0-Upgrade.md#redis-client

そのため、Redis Cloudを使用している場合、RESP3を使うように設定する必要があります。

Redis Cloudの管理画面に行き、使っているDBインスタンスの画面を開き、「Edit database」ボタンを押すと、下記のようにRESP2とRESP3を設定できるので、RESP3に設定します。

これをしていない場合、下記のようなエラーが出ます。

/app/vendor/bundle/ruby/3.1.0/gems/redis-client-0.22.2/lib/redis_client/connection_mixin.rb:36:in `call': NOAUTH Authentication required 

認証周りのエラーだと思い、パスワードの設定など変更してみましたが、エラーは変わらず、結局、RESP3の設定が原因だったことが分かりました。

開発環境のredisでは、redisのバージョンによってRESP3が自動的に使えるようになるのでエラーは発生しませんでした。Heroku環境のRedis Cloudでのみ発生するので、原因が追いにくかったです。

解決のきっかけになったgithub issues

https://github.com/sidekiq/sidekiq/issues/5594#issuecomment-1694783662

2. redis-namespace gemの削除

https://github.com/sidekiq/sidekiq/blob/main/docs/7.0-Upgrade.md#redis-namespace

Sidekiq7でredis-namespaceのサポートが外れたので、公式のアップグレードガイドに従い、「Redis's numbered databases」を使おうと思ったら、HerokuアドオンのRedis Cloudでは非対応でした。

デフォルトの0番ではなく、1番のdatabaseを指定して、Heroku環境のRedis Cloudに接続しようとすると、下記のエラーが出ます。

ERR DB index is out of range

アドオンの公式サイトに下記のように書いてあります。

https://elements.heroku.com/addons/rediscloud

Multiple dedicated databases in a plan
We enable multiple DBs in a single plan, each running in a dedicated process and in a non-blocking manner.

てっきり、「Redis's numbered databases」のことかと思っていましたが、単純に複数のRedisインスタンスを起動できるというものでした。

有料プランなのになんで「Redis's numbered databases」が使えないんだと思っていたら、そういうことでした。。

Redis Cloudで新しいRedisインスタンスを作成するボタンが、かなり見つけにくいことも迷走した原因です。

Redis Cloudの管理画面に行き、「Subscriptions」メニューを開きます。すると、画面の右上に「+ Add database to subscription」というリンクがあるので、そこから新しいRedisインスタンスを作成できます。

結局、Redis CloudのRedisでは、「Redis's numbered databases」を使わずに、利用用途によって異なるインスタンスを指定するという対応に落ち着きました。

終わりに

Redis依存ではなく、Redis Cloud依存の問題なので、情報が少なく苦労しました。誰かのお役に立てれば幸いです。

Discussion