Action Cable
Rails内蔵WebSocket — リアルタイム機能実現
Action CableはRails内蔵のWebSocketフレームワークで、サーバー→クライアントのリアルタイム通信を可能にします。
サーバー(Channel): ChatChannelクラスのsubscribedメソッドでstream_from "chat_room_1"でチャンネルを購読し、receiveメソッドで受信データをActionCable.server.broadcastでブロードキャスト。
クライアント(JavaScript): consumer.subscriptions.createでチャンネルを購読し、receivedコールバックで受信データをDOMに反映。
Turbo Streamと結合すればJavaScriptなしでもリアルタイムDOM更新が可能。Turbo::StreamsChannel.broadcast_append_toでサーバーから直接DOM要素を追加/修正/削除できます。
WebSocket活用事例: リアルタイム音声書き起こし(STT)
WebSocketはリアルタイム音声認識(STT)にも核心的に使用されます。Deepgram、Azure Speech等のサービスはWebSocket接続を開きオーディオストリームを100〜200ms単位で連続送信すると、サーバーがリアルタイムで中間結果(interim)と最終結果(final)を返します。
REST API方式(Groq Whisper): 録音を4秒セグメントに切ってHTTP POSTで送信 → 遅延4〜5秒、文脈断絶
WebSocket方式(Deepgram/Azure): オーディオチャンクを連続ストリーミング → 遅延0.3〜1秒、文脈維持
RailsでのWebSocket使用時の注意事項
1. プロダクションアダプター必須
開発環境:
asyncアダプター(デフォルト、単一プロセス)プロダクション: 必ず
redisまたはsolid_cableアダプターを使用Rails 8: Solid Cable(DBベース)利用可能 — Redisなしでもプロダクション運用
2. Nginx/リバースプロキシ設定
- WebSocketはHTTP Upgradeハンドシェイクが必要 — Nginx別途設定必須
3. 認証とセキュリティ
ApplicationCable::Connectionでcookies.encrypted[:user_id]による認証config.action_cable.allowed_request_origins— 許可ドメイン設定必須プロダクション: 必ず
wss://(TLS)を使用
4. コネクション管理とメモリ
各WebSocket接続はサーバーメモリを持続的に占有
Channelの
unsubscribedコールバックでリソース整理必須
5. 水平スケーリング
マルチサーバー: Redis Pub/Subでサーバー間メッセージ同期
ロードバランサー: Sticky Session必要
大規模: AnyCable検討 — Go/Rustベースで Ruby比10倍性能、Action Cable API互換
6. テスト
ActionCable::Channel::TestCaseでChannel単体テストassert_broadcast_on/assert_has_streamでブロードキャスト検証統合テスト: Capybara + JSドライバー(System Test)でWebSocket動作確認
キーポイント
rails generate channel Chat → Channelクラス生成
subscribedでstream_fromによりチャンネル購読
ActionCable.server.broadcastでメッセージブロードキャスト
クライアントがconsumer.subscriptions.createで購読
receivedコールバックで受信データ処理
Turbo Streamと結合: broadcast_append_toでDOM自動更新
メリット
- ✓ Rails内蔵 — 別途インストール不要
- ✓ Turbo Streamと完全統合
- ✓ Channelパターンで構造的
- ✓ 認証自動連動(current_user)
- ✓ Rails 8: Solid CableでRedisなしでもプロダクション可能
デメリット
- ✗ WebSocket接続維持コスト(メモリ/コネクション)
- ✗ Redisアダプター必要(プロダクション、Rails 7以下)
- ✗ 水平スケーリング時Sticky SessionまたはAnyCableが必要
- ✗ デバッグ困難(非同期 + ネットワーク)
- ✗ NginxにWebSocket Upgrade設定が必須