Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
URL外形監視
GMO Pepabo, Inc.
Joe Honzawa
2015/7/9 Elixir勉強会
やってみた
最近のニュース
こんな感じ?
監視するやつ
http://hoge.com http://fuga.com
GET
20x 40x
通知先
http://fuga.comがヤバイ!
GET
小規模なら
できるのでは?
こんな感じ?
WatcherSup
Watcher Watcher Watcher
GET GET GET
> とりあえず監視部分だけ
Watcher
> 1分間隔で指定URLにGET
> ステータスコードを親に送る
> 「定期的に何かする」仕組みが必要
Watcher
defmodule 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....
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やってみよ
WatcherSup
def start(_type, _args) do
children = [
worker(Watcher, [])
]
opts = [
strategy: :simple_one_for_one,
name: Wat...
WatcherSup
def 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 ->
Worker...
しばらく待つ
監視できてるっぽい
iex(4)> flush
{"https://hex.pm/", 200}
{"https://github.com/", :connect_timeout}
{"https://hex.pm/", 200}
{"http...
まとめ
> URL外形監視っぽいことした
> 定期的に何かする
> Process.send_after/2
> 1プロセスが1URLを担当
> Supervisor.start_child/2
Upcoming SlideShare
Loading in …5
×

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

1,832 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. URL外形監視 GMO Pepabo, Inc. Joe Honzawa 2015/7/9 Elixir勉強会 やってみた
  2. 2. 最近のニュース
  3. 3. こんな感じ? 監視するやつ http://hoge.com http://fuga.com GET 20x 40x 通知先 http://fuga.comがヤバイ! GET
  4. 4. 小規模なら できるのでは?
  5. 5. こんな感じ? WatcherSup Watcher Watcher Watcher GET GET GET > とりあえず監視部分だけ
  6. 6. Watcher > 1分間隔で指定URLにGET > ステータスコードを親に送る > 「定期的に何かする」仕組みが必要
  7. 7. Watcher defmodule Watcher do use GenServer def start_link do GenServer.start_link(__MODULE__, []) end # 続く
  8. 8. 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
  9. 9. stateには例えば > GETするURL > GETの結果を送る宛先PID defmodule Watcher.State do defstruct [:url, :pid] end
  10. 10. Watcher def Process.send_after { end send state.pid, get_request(state.url) 詳細は割愛 HTTPoison使いました
  11. 11. ここまで > できたこと > 定期的なGETリクエスト > どこかにその結果を送ること > 次は > 動的に監視対象を増やしたい
  12. 12. つまり WatcherSup Watcher Watcher Watcher > WatherSupに動的に子供を追加する
  13. 13. どうする > Supervisor.start_child/2 > 子を動的に追加する > 子はWatcherだけ > simple_one_for_oneやってみよ
  14. 14. WatcherSup def start(_type, _args) do children = [ worker(Watcher, []) ] opts = [ strategy: :simple_one_for_one, name: WatcherSup ] Supervisor.start_link(children, opts) end この時点では子は産まれない
  15. 15. WatcherSup def start_child(url, pid) do Supervisor.start_child( WatcherSup, [url, pid] ) end これを呼ぶと子が産まれる
  16. 16. 動かす 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
  17. 17. しばらく待つ
  18. 18. 監視できてるっぽい 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}
  19. 19. まとめ > URL外形監視っぽいことした > 定期的に何かする > Process.send_after/2 > 1プロセスが1URLを担当 > Supervisor.start_child/2

×