よしたく blog

ほぼ週刊で記事を書いています

Action CableをHerokuで動かす時のサブスクリプションアダプタ設定

Heroku で Action Cable を使うにはデフォルトの設定から変更する必要がある。 具体的に、初期設定ではconfig/cable.ymlファイルは下記のようになっており、redis を使う設定になっている。Heroku 環境を用意したときにデフォルトで Redis は使用できないので production 部分を変更する必要がある。

development:
  adapter: async

test:
  adapter: test

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: heroku_cable_production

Action Cable で使えるサブスクリプションアダプタ

Action Cable で使えるサブスクリプションアダプタを整理する。 前提として Action Cable を動かすためにはサブスクリプションアダプタを設定する必要があり、現在利用できるアダプタは 3 種類ある。

  • Async アダプタ
    • 開発やテスト環境で利用するためのもの
  • Redis アダプタ
  • PostgreSQL アダプタ

Async アダプタは開発やテスト環境用で、 Heroku を本番環境として用意し Action Cable を動かすためには適していない。 Redis アダプタは、Heroku で Redis を使おうとすると別料金が掛かるため、一旦選択肢から外す。 その結果、Heroku 環境で無料利用できる PostgreSQL アダプタを使うのが選択肢に上がってくる。 ここからは PostgreSQL アダプタを使うための設定変更をおこなう。

設定変更

config/cable.yml の設定を変更する。 作成直後、 production 部分は redis が指定されていたが adapter を postgresql に変更する。 また、URL 部分も DATABASE_URL を見るように変更する。

development:
  adapter: async

test:
  adapter: test

-production:
-  adapter: redis
-  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
-  channel_prefix: heroku_cable_production
+production:
+  adapter: postgresql
+  url: <%= ENV['DATABASE_URL'] %>

まとめ

Heroku で Action Cable を使うための設定変更を確認した。 ちなみに、Heroku 環境で async 使うことは推奨されていないだけで、使うことはできる。 その場合は development に書いてあるのと同じように adapter に async を設定すれば利用可能になる。

development:
  adapter: async

test:
  adapter: test

-production:
-  adapter: redis
-  url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
-  channel_prefix: heroku_cable_production
+production:
+  adapter: async