スキップしてメイン コンテンツに移動

RubyPub/Subチャット

RubyPub/Subチャット

ActionCableで実現するリアルタイム通信

Ruby on Rails 5以降、ActionCableはWebSocketを簡単に扱えるフレームワークです。サーバー側はRailsのコントローラと同じ構成で書けるため、既存のMVCアーキテクチャに自然に統合できます。クライアントはJavaScriptで ActionCable.createConsumer を呼び出し、チャネルに接続します。

# app/channels/chat_channel.rb
class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from "chat_#{params[:room]}"
  end

  def receive(data)
    ActionCable.server.broadcast "chat_#{params[:room]}", data
  end
end

上記のように、サブスクライブ時にストリームを設定し、受信したデータを同じストリームへブロードキャストするだけで、リアルタイムチャットが実装できます。WebSocketは双方向通信を可能にし、サーバーからクライアントへ即時に通知を送ることができます。

Pub/Subパターンとチャット・通知の実装

ActionCableは内部でPub/Subパターンを採用しています。ストリームは「パブリッシャー」と「サブスクライバー」の関係で構成され、同じチャンネル名を持つクライアントはすべて同じメッセージを受け取ります。これにより、チャットルームや通知システムを簡潔に構築できます。

通知機能を追加する場合は、ユーザーごとに専用ストリームを作成し、サーバー側で ActionCable.server.broadcast を呼び出すだけです。例えば、未読メッセージ数をリアルタイムで更新するケースを考えてみましょう。

# app/channels/notification_channel.rb
class NotificationChannel < ApplicationCable::Channel
  def subscribed
    stream_from "notifications_#{current_user.id}"
  end
end

# コントローラ内で通知を送信
ActionCable.server.broadcast "notifications_#{user.id}", { unread_count: user.unread_messages.count }

このように、Pub/Subを活用すれば、チャットだけでなく、リアルタイム通知やダッシュボード更新など多様な双方向通信が実現できます。

双方向通信のベストプラクティス

ActionCableを使ったリアルタイム通信を安定させるためのポイントをまとめます。

  • ストリーム名は一意にし、不要なメッセージが混在しないようにする。
  • サーバー側で認証・認可を必ず行い、ユーザーが許可されたチャネルにのみ接続できるようにする。
  • 大量のクライアントが同時に接続する場合は、Redisなどの外部ブローカーを導入し、スケールアウトを検討する。
  • クライアント側では再接続ロジックを実装し、ネットワーク障害時に自動で再接続できるようにする。
  • メッセージサイズは小さく保ち、JSON形式で送信する際は不要なキーを省く。

これらを守ることで、チャットや通知などのリアルタイム機能を高い可用性と低レイテンシで提供できます。Ruby応用の一環として、ActionCableとPub/Subを組み合わせることで、WebSocketを活用した双方向通信を簡単に実装できる点が大きな魅力です。

この記事はAIによって作成されました。

コメント