はじめに
前回は、Templateを見てきました。
今回は、Channelについてです。
次回は、Ectoです。
側溝
Channelは、Phoenixの強力な機能の一つです。この機能によって、容易にリアルタイム性を実現することができます。
Channelは、単純なメッセージ通信によって構成されます。送り手がメッセージをブロードキャストし、受け手は必要に応じてメッセージを受け取るという仕組みです。送り手と受け手は、それぞれ同時に別の役割を果たすこともできます。
Elixirには元々メッセージパッシングの機構があるのですが、ChannelではElixirのプロセスを直接扱う必要はありません。受け手と送り手ともに、Channelを介して通信を行うことができます。また、Channelの場合、Elixirのプロセスモデルと異なり、メッセージをブロードキャストすることができます。
なお、ここでいう"Channel"という言葉は、複数のコンポーネントからなるシステムを指す言葉です。
構成要素
ここでは、Channelを構成する各要素について見ていきます。
-
Socket Handler
Phoenixではサーバ側で単一コネクションだけを確立し、それを多重化して使っています。Socket Handlerは、このコネクションを使用するためのモジュールで、認証や識別を行うことができます。
例えば、HelloPhoenix.UserSocket(web/channels/user_socket.ex
)では、全チャンネルで誰でも使用することできるデフォルトソケットとして設定されています。 -
Channel Route
Channel Routeは、Socket Handler内で定義されており、他のRouteとはそれぞれ独立しています。これは、メッセージを、Topic文字列に応じたChannelに振り分けるためのルールを表しています。
Topic文字列には、ワイルドカード(*)をしていすることができます。例えば、以下の例では、sample_topic:pizza
とsample_topic:oranges
の両方とも、SampleTopicChannelに送られることを示しています。
channel "sample_topic:*", HelloPhoenix.SampleTopicChannel
-
Channel
Channelは、クライアントからのイベントを処理するという点ではControllerに似ています。
ただし、違う点が二点あります。一つに、Channelのイベントには、incomingとoutgoingの両方の向きがあるという点です。
もう一つは、Channelのコネクションは、リクエスト/レスポンスのサイクルを超えて存在するという点です。
Channelは、次の四つのコールバック関数について、一部またはすべてを実装することができます。join/3
,terminate/2
,handle_in/3
,handle_out/3
です。 -
PubSub
PhoenixのPubSubレイヤーは、Phoenix.PubSub
モジュールと、そのためのアダプタ、アダプタのGenServer
からなります。これらのモジュールは、Topicの購読(Subscribe)、Topicの購読解除(Unsubscribe)、Topicに関してブロードキャストなどの関数を含みます。
必要であれば、独自のPubSubアダプタを作成することもできます。
なお、これらのモジュールは、Phoenixが内部的に使用し、ユーザが直接操作する必要がありません。 -
Message
Phoenix.Socket.Message
モジュールは、以下のキーと値を持っています。
- topic - Topicやtopic:subtopicの文字列 (例) "messages", "messages:123"
- event - イベント名 (例) "phx_join"
- payload - メッセージの本体
- ref - unique文字列
-
Topic
Topicは文字列による識別子です。メッセージが正しい場所に届けられるようにさまざまなレイヤーで使用されます。
上で書かれている通り、Topicにはwilcardを使用することもできます。これは、"topic:subtopic"という記載方法を用いるときに便利です。また、"users:123"のようにTopicと何らかのIDをセットにするという方法もよく用いられます。 -
Transport Adapter
Transportレイヤーは、メッセージの送受信を担当します。Phoenix.Channel.Transport
モジュールは、Channelを出入りする全メッセージをハンドルするモジュールです。 -
Client Library
PhoenixではJavaScriptのクライアントが付属されています。また、iOS、Android、C#用クライアントもPhoenix1.0でリリースされています。
Chatアプリの例
ガイドにあるChatアプリの例は、別建てで記事を書きます(予定)。