19
URL外形監視 GMO Pepabo, Inc. Joe Honzawa 2015/7/9 Elixir勉強会 やってみた

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

  • Upload
    joenoh

  • View
    550

  • Download
    0

Embed Size (px)

Citation preview

Page 1: やってみた -URL外形監視-

URL外形監視

GMO Pepabo, Inc. Joe Honzawa

2015/7/9 Elixir勉強会

やってみた

Page 2: やってみた -URL外形監視-

最近のニュース

Page 3: やってみた -URL外形監視-

こんな感じ?

監視するやつ

http://hoge.com http://fuga.com

GET20x 40x

通知先

http://fuga.comがヤバイ!

GET

Page 4: やってみた -URL外形監視-

小規模なら

できるのでは?

Page 5: やってみた -URL外形監視-

こんな感じ?

WatcherSup

Watcher Watcher Watcher

GET GET GET

> とりあえず監視部分だけ

Page 6: やってみた -URL外形監視-

Watcher> 1分間隔で指定URLにGET > ステータスコードを親に送る

> 「定期的に何かする」仕組みが必要

Page 7: やってみた -URL外形監視-

Watcherdefmodule Watcher do use GenServer

def start_link do GenServer.start_link(__MODULE__, []) end

# 続く

Page 8: やってみた -URL外形監視-

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

Page 9: やってみた -URL外形監視-

stateには例えば> GETするURL > GETの結果を送る宛先PID

defmodule Watcher.State do defstruct [:url, :pid] end

Page 10: やってみた -URL外形監視-

Watcher

def Process.send_after

{end

send state.pid, get_request(state.url)

詳細は割愛 HTTPoison使いました

Page 11: やってみた -URL外形監視-

ここまで> できたこと > 定期的なGETリクエスト > どこかにその結果を送ること > 次は > 動的に監視対象を増やしたい

Page 12: やってみた -URL外形監視-

つまり

WatcherSup

Watcher Watcher Watcher

> WatherSupに動的に子供を追加する

Page 13: やってみた -URL外形監視-

どうする> Supervisor.start_child/2 > 子を動的に追加する

> 子はWatcherだけ > simple_one_for_oneやってみよ

Page 14: やってみた -URL外形監視-

WatcherSupdef start(_type, _args) do children = [ worker(Watcher, []) ]

opts = [ strategy: :simple_one_for_one, name: WatcherSup ] Supervisor.start_link(children, opts) end

この時点では子は産まれない

Page 15: やってみた -URL外形監視-

WatcherSupdef start_child(url, pid) do Supervisor.start_child( WatcherSup, [url, pid] ) end

これを呼ぶと子が産まれる

Page 16: やってみた -URL外形監視-

動かす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

Page 17: やってみた -URL外形監視-

しばらく待つ

Page 18: やってみた -URL外形監視-

監視できてるっぽい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}

Page 19: やってみた -URL外形監視-

まとめ> URL外形監視っぽいことした

> 定期的に何かする > Process.send_after/2

> 1プロセスが1URLを担当 > Supervisor.start_child/2