/var/log/messages

Apr 22, 2019 - 2 minute read - Comments - programming

phoenix excersize (14)

Channels の続き。

PubSub

これなのかどうか。Publisher と Subscriber なんすね。

The Moving Parts

  • トピックごと、クライアントごとに一つの Channel Server Process が生成
  • クライアントからのメッセージはトピックに基づいて正しい Channel Server に routing される

Endpoint

以下、Socket 宣言の例。

socket "/socket", HelloWeb.UserSocket,
  websocket: true,
  longpoll: false
  • Phoenix のデフォルトトランスポート
    • websocket
    • longpoll

Socket Handlers

  • 上記のような Socket Handler は Channel 接続を設定するときに呼び出される
  • 特定の URL への接続は Endpoint の設定に基づいてすべて同じ Socket Handler を使う

ううむ、なんだか分かったような分かっていないような。

Channel Routes

  • Socket Handler で定義
  • トピック文字列でマッチング

以下の例では room:lobbyroom:123 のリクエストは両方 RoomChannel に dispatch される。

channel "room:*", HelloWeb.RoomChannel

Channels

  • Channel は Controller と似ているが二点の違いがある

    • Channel Event は発信と着信の両方を処理できる
    • Channel 接続も単一の要求/応答サイクルを超えて持続する
  • 各 Channel は以下を実装

    • join/3
    • terminate/2
    • handle_in/3
    • handle_out/3

Topics

  • Topics は識別子 - メッセージが正しい場所に届くようにするために、さまざまなレイヤが使う名前
  • トピックはワイルドカードが使える
  • topic:subtopic 規約

Messages

Phoenix.Socket.Message モジュールは有効なメッセージを表す構造体を以下のキーで定義する

  • topic
    • 文字列 “topic” または “topic:subtopic” というペア
  • event
    • 文字列イベント名
  • payload
    • メッセージのペイロード
  • ref
    • ユニークな文字列

PubSub

  • Phoenix PubSub レイヤは通常では直接使わない
  • PubSub は Phoenix.PubSub モジュールとさまざまなアダプタ、およびそれらの GenServer 用の様々なモジュールから構成される
  • 分散 Elixir またはサーバ間の直接通信をサポートしていない場合、Redis を使ってデータ交換を行なう Redis アダプタもある

分散 Elixir?

これもちょい確認してみます。一旦エントリ投入。何かあれば追記の方向にて。

phoenix excersize (13) phoenix excersize (15)

comments powered by Disqus