[Elixir]PhoenixのSupervisorのstrategy

Phoenixって、1 request 1 process って言われますね。でも、そうは言ってもどうして?というところが気になります。
その中身をちらっと追ってみたのでメモ。

process死んだらそのまま、ということは、リクエストに対する処理の信頼性に関してないだろうと思ってひとまずSupervisorあるだろうな。さらには、Phoenix、macroでゴニョゴニョしてるので、動的にSupervisorに子をセットする必要があって、なら最終的には ‘simple_one_for_one’ かなーってのが予想でした。

Phoenix.Supervisor

大元。

defmodule Phoenix.Supervisor do
  use Supervisor

  def start_link do
    Supervisor.start_link(__MODULE__, [], name: __MODULE__)
  end

  def init([]) do
    children = [
      supervisor(Phoenix.Transports.LongPoll.Supervisor, [])
    ]
    supervise(children, strategy: :one_for_one)
  end
end

Phoenix.Transports.LongPoll.Supervisor

ここを one_for_one でよでいるみたい。

defmodule Phoenix.Transports.LongPoll.Supervisor do
  @moduledoc false

  use Supervisor

  def start_link do
    Supervisor.start_link(__MODULE__, [], name: __MODULE__)
  end

  def init([]) do
    children = [
      worker(Phoenix.Transports.LongPoll.Server, [], restart: :temporary)
    ]
    supervise(children, strategy: :simple_one_for_one)
  end
end

defmodule Phoenix.Transports.LongPoll.Server

先ほどのSupervisorのchildrenで読んでいたところは同じファイル内に同様に定義されています。

defmodule Phoenix.Transports.LongPoll.Server do
  @moduledoc false

  use GenServer

  alias Phoenix.PubSub
  alias Phoenix.Socket.Transport
  alias Phoenix.Socket.Broadcast
  alias Phoenix.Socket.Message

  @doc """
  Starts the Server.
    * `socket` - The `Phoenix.Socket` struct returend from `connect/2`
      of the socket handler.
    * `window_ms` - The longpoll session timeout, in milliseconds
  If the server receives no message within `window_ms`, it terminates
  and clients are responsible for opening a new session.
  """
  def start_link(endpoint, handler, transport_name, transport,
                 serializer, params, window_ms, priv_topic) do
    GenServer.start_link(__MODULE__, [endpoint, handler, transport_name, transport,
                                      serializer, params, window_ms, priv_topic])
  end

  ## Callbacks

  def init([endpoint, handler, transport_name, transport,
            serializer, params, window_ms, priv_topic]) do
    Process.flag(:trap_exit, true)
....

endpointに対してリンクスタートしてますね。
ひとまず、なるほどなー。 simple_one_for_one はあたってた。

広告

[Elixir]PhoenixのSupervisorのstrategy” への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中