Slide 1

Slide 1 text

Channel先生、 PubSubが・・・ したいです・・・! Erlang&Elixir Fest 2018 おーはら

Slide 2

Slide 2 text

About Me おーはら Twitter: @ohrdev GitHub: ohr486 FB: tsunenori.oohara Work: Elixir/Ruby/Infra Engneer Fav: PubSub, 仏像製作

Slide 3

Slide 3 text

ハンズオンイベント ● 5F ○ 5B-1, 5B-2 ● https://github.com/ohr486/ErlangElixirFestHandsO n/wiki ● Enum, Stream, Flow を使ったデータ処理 ○ Eager ○ Lazy ○ Concurrent

Slide 4

Slide 4 text

発表のテーマ Erlang in Anger PubSub in Channel

Slide 5

Slide 5 text

PubSubしない Phoenixはた だのRailsだ

Slide 6

Slide 6 text

発表のテーマ Phoenix Channel & PubSub

Slide 7

Slide 7 text

Agenda ● 今日のゴール ● Phoenix Channel ● Phoenix PubSub ● PubSub Backend ● PubSub Adapterの作り方 ● まとめ

Slide 8

Slide 8 text

今日のゴール ● PhoenixのChannelの構造を知る ● Phoenix.PubSubの構造を知る ● PubSub Backendについて知る ● カスタムAdapterの作り方を理解する ● PubSub力を上げる

Slide 9

Slide 9 text

5min Phoenix Channel App ● Phoenix Channelによるチャット作成(よくあるサンプル) ○ https://github.com/chrismccord/phoenix_chat_example ● step.1 : Phoenixプロジェクトの作成 ● step.2 : Socketハンドラ設定 [ server ] ● step.3 : Channelモジュール作成 [ server ] ● step.4 : Client実装 [ client ]

Slide 10

Slide 10 text

Phoenix Channel ● Phoenix Channelは、Phoenixフレームワークが提供する、PubSubモデルのメッ セージ通信の機構 ● メッセージ受信 : トピックを購読していればメッセージを受信 ● メッセージ送信 : トピックに対してメッセージをブロードキャスト ● クライアントは、メッセージの受信・送信どちらも可能 Phoenix Channel Topic1 Topic2 購読 送信 受信 client1 client2 client3

Slide 11

Slide 11 text

Phoenix Channel ● クライアントとサーバーの通信は、WebSocketを通して行われます ● クライアントとサーバーのWebScoket接続は1つです ● WebSocketの上に複数のチャネルソケットがある 単一のwebsocket接続 Phoenix Server client channel1の通信 channel2の通信

Slide 12

Slide 12 text

Phoenix Channel Phoenix Server VM socket handler client1 chnnel [client1,topic1] socket handler client2 chnnel [client2,topic1] chnnel [client1,topic2] PubSub PubSub Backend ・チャネルへのルーティング ・メッセージのディスパッチ ・トピックの購読 ・トピックの退会 ・メッセージ送受信 ・認証 Phoenix.Socket Phoenix.Channel Phoenix.PubSub websocket websocket

Slide 13

Slide 13 text

Phoenix PubSub ● PhoenixのPubSub層は、PubSubモジュール、アダプタ、バックエンドの3層に分解 できます ● PubSubは以下の2種類に分類できます ○ 自サーバーのチャネルに対して通信を行うローカル PubSub ○ 同一クラスタ内の他サーバーのチャネルに対して通信を行うリモート PubSub client1 client2 client3 local pubsub channel1 channel2 remote pubsub local pubsub remote pubsub channel3 PubSub Backend Phoenix.PubSub Phoenix.PubSub.Local PubSub Adapter

Slide 14

Slide 14 text

Phoenix PubSub application master MyApp.Supervisor MyApp.Web.Endpoint MyApp.PubSub.Supervisor PubSub.LocalSupervisor MyApp.PubSub.Endpoint.Server Supervisor.Default PubSub.GC Local PubSub Process Remote PubSub Process TCP Listener Supervisor TCP Acceptor Supervisor … Conn Supervisor … … TCP Acceptor Channel Process PubSub Channel Controller WebSocket Handler

Slide 15

Slide 15 text

PubSub Backend ● PhoenixはPubSubのバックエンドを選択できます ● Official Backend Adapter ○ PG2 ( Process Group 2 ) ○ Redis ● 3rd Party Backend Adapter ○ https://github.com/h4cc/awesome-elixir#framework-components ● Custom Backend ○ Adapterを実装することで、独自のバックエンドを利用できます ○ see: LT@cctiger36 (phoenix_pubsub_redis_z) ■ 複数のRedisをbackendにするpubsub adapter

Slide 16

Slide 16 text

PubSub Backend ● PubSub Adapterを変更する事で、バックエンドを差し替え可能です ● Adapterの変更方法 ○ configのpubsub adapterを変更 {phoenix-app}/config/config.exs

Slide 17

Slide 17 text

PubSub Adapterの作り方 ● PubSub Adapterとは ○ (1) LocalSupervisor、(2) Backendとの通信を行うGenServerプロセス を持つSupervisorモジュー ル ● AdapterのRemotePubSubProcessの挙動 ○ Backendとの通信を行う ○ Backendからの通信を受け取り、 Local PubSubにブロードキャスト ○ Local PubSubからメッセージを受信し、 Backendに送信

Slide 18

Slide 18 text

PubSub Adapterの作り方 application master MyApp.Supervisor MyApp.Web.Endpoint MyApp.PubSub.Supervisor PubSub.LocalSupervisor MyApp.PubSub.Endpoint.Server Supervisor.Default PubSub.GC Local PubSub Process Remote PubSub Process TCP Listener Supervisor TCP Acceptor Supervisor … Conn Supervisor … … TCP Acceptor Channel Process WebSocket Handler Backend Driver Process Adapter

Slide 19

Slide 19 text

PubSub Adapterの作り方 supervisorとして振る舞う LocalSupervisorをsuperviseする Local PubSubの振る舞いを定義 Remote PubSubの実体 local pubsub local pubsub supervisor remote pubsub pubsub adapter

Slide 20

Slide 20 text

PubSub Adapterの作り方 serverとして振る舞う Local PubSubに対するブロードキャスト Backendに対するメッセージ送信 local pubsub local pubsub supervisor remote pubsub pubsub adapter

Slide 21

Slide 21 text

まとめ ● PhoenixのChannelのアーキテクチャを紹介しました ● PhoenixにおけるPubSubの構造を紹介しました ● カスタムBackendのAdapterの作り方を紹介しました

Slide 22

Slide 22 text

Let’s PubSub

Slide 23

Slide 23 text

powered by