Rails Action Cable徹底解説!broadcastとstream_fromで学ぶリアルタイム通信の基本とパフォーマンス
生徒
「Railsでチャットや通知みたいに、画面が自動で更新される仕組みってどうなっているんですか?」
先生
「RailsにはAction Cableという、リアルタイム通信を簡単に扱える仕組みがあります。」
生徒
「broadcastとかstream_fromって言葉を見たんですが、何が違うのか全然わからなくて…」
先生
「そこが一番大事なポイントですね。仕組みと考え方を、例えを使ってゆっくり説明しますよ。」
1. Action Cableとは?Railsでリアルタイム通信を行う仕組み
Action Cableは、Railsに標準で用意されているリアルタイム通信のための機能です。 リアルタイム通信とは、ページを再読み込みしなくても、サーバーからの最新情報が自動的に画面へ届く仕組みのことです。
例えば、チャットアプリで誰かがメッセージを送信すると、他の人の画面にもすぐに表示されます。 この裏側ではWebSocketという、常に通信し続ける特別な接続方法が使われています。
Action Cableは、このWebSocketの難しい部分をRailsが肩代わりしてくれるため、 初心者でも比較的シンプルなコードでチャットや通知機能を作れるのが特徴です。
2. WebSocketの超かんたんイメージ
WebSocketを身近なもので例えると、「電話」に近い仕組みです。 普通のWeb通信は、手紙のように必要なときだけ送って返事を待つ形です。
一方でWebSocketは、一度つながると電話のようにつながりっぱなしになります。 そのため、サーバー側から「今すぐ伝えたい情報」があれば、すぐに利用者へ届けることができます。
Railsでは、このWebSocketをAction Cableが管理し、 私たちは「どこに」「何を送るか」だけを考えればよい仕組みになっています。
3. broadcastとは?情報を一斉送信する考え方
broadcastは、指定した場所に向けてデータを送信する仕組みです。
たとえば「チャットルーム1」という名前の場所に対して、メッセージを送るイメージです。
駅の構内アナウンスを想像してください。 「〇番線に電車が到着します」と放送すると、その場所にいる人全員に同じ情報が届きます。 broadcastは、まさにこの放送の役割を果たします。
ActionCable.server.broadcast(
"chat_room_1",
{ message: "こんにちは!" }
)
このコードは「chat_room_1」という名前のストリームに対して、 「こんにちは!」というメッセージを送信しています。
4. stream_fromとは?受信側の設定
stream_fromは、どこから情報を受け取るかを決める命令です。
broadcastが「送る側」だとすると、stream_fromは「受け取る側」になります。
ラジオで言えば、「この周波数を聞きます」とチャンネルを合わせる行為です。 チャンネルを合わせていないと、どんな放送も聞こえません。
class ChatChannel < ApplicationCable::Channel
def subscribed
stream_from "chat_room_1"
end
end
この設定により、このチャンネルに接続している利用者は、 「chat_room_1」に送られた情報を受信できるようになります。
5. 対象スコープとは?誰に届けるかを考える
Action Cableでとても重要なのが対象スコープです。 これは「その情報を誰に見せるのか」という範囲を決める考え方です。
全員に見せる通知もあれば、特定のユーザーだけに見せたい情報もあります。 例えば「あなた宛ての通知」は、他の人に見えてはいけません。
stream_from "user_#{current_user.id}_notifications"
このようにユーザーIDを含めることで、 「この人専用の通知チャンネル」を作ることができます。 対象スコープを意識することで、無駄な通信や情報漏れを防げます。
6. パフォーマンスの基本:流しすぎない工夫
リアルタイム通信は便利ですが、使いすぎるとパフォーマンスに影響します。 パフォーマンスとは、アプリの動作の速さや安定性のことです。
不必要に大勢へbroadcastすると、サーバーは大量の通信を処理しなければなりません。 これは、人が多すぎる場所で大声で話すようなものです。
必要な人だけに、必要な情報だけを送ることが、 Action Cableを安全に使うための基本ルールになります。
7. broadcastとstream_fromを組み合わせた流れ
Action Cableの流れはとてもシンプルです。 まず、利用者がstream_fromで「受信する場所」を決めます。 次に、サーバー側でbroadcastを使って情報を送信します。
# メッセージ作成後に通知を送信
ActionCable.server.broadcast(
"chat_room_1",
{ message: "新しい投稿があります" }
)
このように、送信と受信の役割を分けて考えることで、 リアルタイム通信の仕組みがぐっと理解しやすくなります。
8. 初心者がつまずきやすいポイント
初心者がよく迷うのは、「どの名前でstream_fromしているか」と 「broadcast先の名前が一致しているか」です。
名前が一文字でも違うと、情報は届きません。 これは、違うラジオ局を聞いている状態と同じです。
Action Cableでは、名前の管理と対象スコープを意識することが、 安定したリアルタイム機能を作る近道になります。