ActionCable is 何?
WebSocketを使ったリアルタイム処理をRails wayでお手頃に使えるフレームワーク
Google App Engine is not supported WebSocket!!
便利になったActionCableをGAEをにサクっとデプロイして本番稼働しようとおもったらGAEはWebSocket非対応のためActionCableが利用できません。
サポート対象外の機能
次に示す機能は、App Engine フレキシブル環境ではサポートされません。
バックエンド サービスへの HTTP/2 トラフィック
WebSocket
インスタンスに直接アクセスする HTTP リクエスト
https://cloud.google.com/appengine/docs/flexible/ruby/how-requests-are-handled
Google Cloud PlatformでActionCableを利用するには?
HTTP(S)ロードバランサはWebSocketリクエストを自動的にアップグレードしてくれるため、バックエンドにGCEかGKEをデプロイしておけば対応することができます。
HTTP(S) ロードバランサが HTTP(S) クライアントからの WebSocket アップグレード リクエストを認識し、バックエンド インスタンスからアップグレード成功のレスポンスが返されると、現在の接続期間中、ロードバランサが両方向のトラフィックのプロキシとして機能します。バックエンドからアップグレード成功のレスポンスが返されないと、ロードバランサが接続を終了します。
https://cloud.google.com/compute/docs/load-balancing/http/?hl=ja
ロードバランサを使わずに自前でnginxを立てても可
こうやればできるけど素直にHTTP(S)ロードバランサ使ったほうが楽ですね。
server {
location /cable {
proxy_pass http://0.0.0.0:3000/cable;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Rails + ActionCableのGCPでの最小構成図
ActionCableはredis(or postgresql)が必要なのでもう1台GCEが必要になります。
はやくGAEでもActionCableが利用できるようになりますように!