やってみた -URL外形監視-

Preview:

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

Recommended