📡

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::Connectioncookies.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動作確認

キーポイント

1

rails generate channel Chat → Channelクラス生成

2

subscribedでstream_fromによりチャンネル購読

3

ActionCable.server.broadcastでメッセージブロードキャスト

4

クライアントがconsumer.subscriptions.createで購読

5

receivedコールバックで受信データ処理

6

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設定が必須

ユースケース

リアルタイムチャット 通知システム リアルタイムダッシュボード 共同編集 ライブフィード リアルタイム音声書き起こし(STT — WebSocketプロキシ) ライブストリーミングコメント/リアクション