Upgrade to Pro — share decks privately, control downloads, hide ads and more …

軽量プロセスと Phoenix LiveView

Avatar for Tsutomu Kuroda Tsutomu Kuroda
June 03, 2024
42

軽量プロセスと Phoenix LiveView

2024年5月17日(木曜日)に東京浜松町・大門で開催されたElixir/Phoenix入門セミナー(daimon.ex)での発表です。

https://daimon-ex.connpass.com/event/312959/

Avatar for Tsutomu Kuroda

Tsutomu Kuroda

June 03, 2024
Tweet

Transcript

  1. 軽量プロセスとLinuxスレッドの違い • Elixirの軽量プロセスは、メモリを共有し ない。 • Linuxスレッドはメモリを共有する。 • 複数のスレッドを利用したプログラミン グ(マルチスレッドプログラミング)で は、初心者泣かせ(難しい)。

    • ほぼ同じタイミングで複数のスレッドが 同じメモリの領域に対して読み書きを行 うとき、期待した結果が得られないこと がある。 BEAM メモリ コンピューター 軽量プロセス 軽量プロセス プロセス スレッド スレッド
  2. LiveViewは軽量プロセスである • LiveViewを用いたPhoenixアプリケー ションでは、ブラウザ側のLiveSocketオ ブジェクトとサーバー側のLiveView(軽 量プロセス)がWebSocketで接続する。 • ブラウザの数と同じ数のLiveViewが作ら れる。 •

    LiveSocketオブジェクトはJavaScriptの オブジェクト。 • 両者はWebSocketで接続しているので、 常にどちらの方向に対してもメッセージ を送信できる。 BEAM サーバーコンピューター LiveView (軽量プロセス) ブラウザ LiveView (軽量プロセス) LiveSocket オブジェクト ••• ••• ブラウザ LiveSocket オブジェクト WebSocket 接続 WebSocket 接続
  3. ブラウザ上で発生したイベントの情報はLiveViewへ • ブラウザ上でマウスクリックなどのイベ ントが発生すると、その情報が websocket接続に乗ってサーバー側に届 き、メッセージとしてLiveViewの受信箱 に入る。 • LiveViewはそのメッセージに応じて、 LiveViewソケットの「状態」を変更す

    る。 • LiveViewソケットの「状態」が変化する と、HTML文書が再生成され、差分情報が websocket接続に乗ってブラウザ側に届 き、画面が更新される。 BEAM サーバーコンピューター LiveView ブラウザ LiveSocket オブジェクト WebSocket接続 LiveView ソケット イベントの情報 受信箱
  4. LiveViewから自分自身へ時間差でメッセージを送る • LiveView(軽量プロセス)から自分自身 へメッセージを待機時間指定付きで送る ことができる。 • そのメッセージを受けて行う処理の中で 再び自分自身へメッセージを待機時間指 定付きで送ることもできる。 •

    これらの機能を用いると、定期的に LiveViewソケットの状態を更新し、その 結果をブラウザの画面に反映させると いった仕組みを構築できる。 BEAM サーバーコンピューター LiveView ブラウザ LiveSocket オブジェクト WebSocket接続 LiveView ソケット 受信箱 N秒後
  5. Hookオブジェクト • ブラウザとサーバーコンピューターの間 には地理的距離が存在するため、ブラウ ザ上で発生したイベントの情報を LiveViewに送ってから、HTMLの差分情 報を受け取るまでの間に、数百ミリ秒単 位の遅延が生じる。 • ブラウザの画面を更新するのに外部シス

    テム(データベースサーバーなど)への 問い合わせが不要であれば、JavaScript でHookオブジェクトを記述することによ り、その遅延を回避することができる。 BEAM サーバーコンピューター LiveView ブラウザ LiveSocket オブジェクト WebSocket接続 LiveView ソケット Hookオブジェクト Hookオブジェクト
  6. LiveViewとReact: 状態を保持する場所が異なる Webアプリケーション サーバーコンピューター ブラウザ React BEAM サーバーコンピューター LiveView ブラウザ

    LiveSocket オブジェクト WebSocket接続 API API ••• HTTP接続 HTML差分情報 JSONデータ 状態 状態 JSONデータ
  7. LiveViewとReact: プッシュ型/プル型 Webアプリケーション サーバーコンピューター ブラウザ React BEAM サーバーコンピューター LiveView ブラウザ

    LiveSocket オブジェクト WebSocket接続 API API ••• HTTP接続 HTML差分情報 JSONデータ 状態 状態 JSONデータ プッシュ プル