はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー13日目です。
Turbo Stream(ActionCable)を使ったリアルタイム通信について学習したので、まとめます。
リアルタイム通信を実現する仕組みについて
Webアプリケーションにおいてリアルタイム通信を実現するには、Websocketというプロトコルを利用します。
Websocketとは
クライアントとサーバの通信において、双方向の通信を可能にする技術(通信方式?)です。
たとえばhttp通信であれば、クライアントがサーバに問い合わせることはできますがその逆はありません。
一方、Websocketを使うと、サーバが任意のタイミングで特定のクライアントへ情報を送ることが可能です。
なぜWebsocketを使うのか
LINEのようなチャットアプリや通知機能など、あるユーザーのアプリの操作が別のユーザーのアプリの画面に影響を及ぼすようなUIを作るときに必要だからです。
Websocketの仕組み
Websocketの接続は、最初にHTTPリクエストを介して開始され(これを「ハンドシェイク」と呼びます)、その後プロトコルがアップグレードされてWebsocket通信に切り替わります。
プロトコル: Websocketはws://(またはセキュアなwss://)という独自のプロトコルを使用します。これは、HTTPのhttp://やhttps://とは異なります。
通信方式: HTTPの場合はクライアントからサーバーへのリクエスト後、サーバーからレスポンスが返され、その後通信は終了します。一方で、Websocketは接続が開始されるとその接続が切断されるまで継続的にデータの交換が可能です。
WebsocketをRailsで扱うには
WebsocketをRailsで利用するために、Action Cableという技術を利用します。
Action Cableとは
Websocketを使うためにはさまざまなことを考慮する必要があります。それを扱いやすいよう整理、抽象化して提供されるAPIです。Railsに組み込まれています。
Action Cable周りの概念の用語集
コネクション(Connection): クライアントとサーバー間の関係を成立させる基礎となります。サーバーでWebSocketを受け付けるたびに、コネクションのオブジェクトがインスタンス化します。
コンシューマー(Consumer): WebSocketコネクションのクライアントは、コンシューマーと呼ばれます。Action Cableのコンシューマーは、クライアント側のJavaScriptフレームワークによって作成されます。
チャネル(Channel): コンシューマごとに、複数のチャネルをサブスクライブできます。各チャネルは論理的な機能単位をカプセル化しており、チャネル内ではコントローラが典型的なMVCセットアップで行っていることと同様のことを行います。
サブスクライバ(Subscriber): コンシューマーがチャネルでサブスクライブされると、サブスクライバとして振る舞います。サブスクライバとチャネルの間のコネクションは、サブスクリプションと呼ばれます。
ブロードキャスト(Broadcast): あるブロードキャスターによって転送されるあらゆる情報をチャネルのサブスクライバに直接送信するpub/subリンクを指します。各チャネルは、0個以上のブロードキャストをストリーミングできます。
Action Cableで説明するリアルタイム通信の仕組み
クライアントとサーバの間に繋がりを作る
双方向通信ということは、サーバ自らクライアントへ情報を送る必要が出てきます。
なので、Websocketをやるつもりできたクライアントに対してはサーバ側との繋がりを作っておきます。これがコネクションです。コネクションができたら、情報をやりとりするためにチャネルという単位でサーバから情報を送るルートを確保します。
サーバからクライアントへ情報を送る
ブロードキャストを使い、サーバからクライアントへ情報を送ります。