38850


Ruby on Rails の ActionCable を勉強中です。

勉強をしていて一つ疑問に思ったのですが、 Ruby on Rails の ActionCable ではなぜ Redis が必要なのでしょうか？

Node.js の Socket.io では、調べた限りでは特に Redis
またはそれに近いミドルウェアは必要としないようでした。（この認識が間違っている場合は、それもご指摘いただければ幸いです。）

Ruby on Rails も Redis を使わずに WebSocket による双方向通信ができないものかなと思いました。

ご存知の方がいらっしゃいましたら、ご教示いただければ幸いです。


CC BY-SA 3.0
2017-10-17T03:29:07.333
38774
2017-10-19T03:35:06.253
8160
question
ruby-on-rails ruby
Ruby on Rails の ActionCable ではなぜ Redis が必要なのでしょうか？


Redisは必ずしも必要ではありません。

ActionCableではPubSubを実現するためSubscriptionAdapterという仕組みを持っています。これは設定により切り替え可能で、Redisの他にPostgreSQLやinlineを使うこともできます。  
<http://guides.rubyonrails.org/action_cable_overview.html#dependencies>

Railsガイドを参考に設定ファイルを書き換えて、Redis以外のアダプターを使うとよいのではないでしょうか。  
<http://guides.rubyonrails.org/action_cable_overview.html#configuration>

例えば以下のような設定でRedisではなくPostgreSQLを使うことができます。

[code]

    # config/cable.yml
    development:
      adapter: postgresql
    test:
      adapter: postgresql
    production:
      adapter: postgresql
    
[/code]

<https://qiita.com/chshii/items/5a2a322dd3b86c0bd5a6>


CC BY-SA 3.0
2017-10-18T06:22:44.603
38831
2017-10-18T08:15:59.083
2017-10-18T08:15:59.083
2599
2599
38774
answer


実運用ではRailsアプリケーションとActionCableは別プロセス(やサーバ)になることが想定されるので、プロセスを超えてデータをやりとりする仕組みが必要になります。Redisはこのために使われます。Redis(ともう一つの選択肢であるPostgreSQL)が使われる理由は、標準でイベントベースの通信機能をサポートしているからです。

Socket.ioは詳しくないのですが、アプリケーションと別サーバで運用する場合やWebSocketサーバを複数運用しないといけない場合はプロセス間でのやりとりが必要となるのは変わりありませんので、それを(実運用に耐える形で)実装するにはRedisのようなミドルウェアが必要となるのではないかと思います。


CC BY-SA 3.0
2017-10-19T03:35:06.253
38850
2017-10-19T03:35:06.253
5793
38774
answer