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 はあたってた。
1 Comment