Upload
joenoh
View
550
Download
0
Embed Size (px)
Citation preview
URL外形監視
GMO Pepabo, Inc. Joe Honzawa
2015/7/9 Elixir勉強会
やってみた
最近のニュース
こんな感じ?
監視するやつ
http://hoge.com http://fuga.com
GET20x 40x
通知先
http://fuga.comがヤバイ!
GET
小規模なら
できるのでは?
こんな感じ?
WatcherSup
Watcher Watcher Watcher
GET GET GET
> とりあえず監視部分だけ
Watcher> 1分間隔で指定URLにGET > ステータスコードを親に送る
> 「定期的に何かする」仕組みが必要
Watcherdefmodule Watcher do use GenServer
def start_link do GenServer.start_link(__MODULE__, []) end
# 続く
Watcher def init(state) do Process.send_after self, :tick, 5000 {:ok, state} end
def handle_info(:tick, state) do Process.send_after self, :tick, 60000 do_something(state) {:noreply, state} end end
stateには例えば> GETするURL > GETの結果を送る宛先PID
defmodule Watcher.State do defstruct [:url, :pid] end
Watcher
def Process.send_after
{end
send state.pid, get_request(state.url)
詳細は割愛 HTTPoison使いました
ここまで> できたこと > 定期的なGETリクエスト > どこかにその結果を送ること > 次は > 動的に監視対象を増やしたい
つまり
WatcherSup
Watcher Watcher Watcher
> WatherSupに動的に子供を追加する
どうする> Supervisor.start_child/2 > 子を動的に追加する
> 子はWatcherだけ > simple_one_for_oneやってみよ
WatcherSupdef start(_type, _args) do children = [ worker(Watcher, []) ]
opts = [ strategy: :simple_one_for_one, name: WatcherSup ] Supervisor.start_link(children, opts) end
この時点では子は産まれない
WatcherSupdef start_child(url, pid) do Supervisor.start_child( WatcherSup, [url, pid] ) end
これを呼ぶと子が産まれる
動かすiex(1)> urls = [ "https://github.com/", "https://hex.pm/" ] iex(2)> me = self
iex(3)> Enum.each urls, fn url -> WorkerSup.start_child(url, me) end
しばらく待つ
監視できてるっぽいiex(4)> flush {"https://hex.pm/", 200} {"https://github.com/", :connect_timeout} {"https://hex.pm/", 200} {"https://github.com/", 200} {"https://hex.pm/", 200} {"https://github.com/", 200}
まとめ> URL外形監視っぽいことした
> 定期的に何かする > Process.send_after/2
> 1プロセスが1URLを担当 > Supervisor.start_child/2