糸より軽い(?)繊維の話
by
Hirotake Kobayashi
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 糸より軽い(?)繊維の話 ラクスル株式会社 小林 寛武 令和元年 5月15日
Slide 2
Slide 2 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. About me 小林 寛武 ● Server Side Engineer, Tech Lead in RAKSUL ● Works for RAKSUL INC. from 2017/02 ● printing SCM team ● I ● I play CHUNITHM hkobayash @hkobayash
Slide 3
Slide 3 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3 Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
Slide 4
Slide 4 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3 Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
Slide 5
Slide 5 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are the Right Solution」振り返り YouTube に動画が上がっているので、そちらをどうぞ。 資料:Fibers Are the Right Solution
Slide 6
Slide 6 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are the Right Solution」振り返り(3行) ● Blocking する処理によりスケーラビリティが損なわれる ● スケーラビリティ改善のための Fiber と Falcon という選択肢 ● Fiber が正しい選択 出典: Fibers Are the Right Solution
Slide 7
Slide 7 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3 Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
Slide 8
Slide 8 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Fiber とは? ● Ruby 1.9 で登場 ● Enumerator の内部実装ために実装 ● Thread(糸) より軽量という意味で、Fiber(繊維)と名付けられた
Slide 9
Slide 9 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」について ● 計算機科学の概念の一つ ● プログラムのある時点で、処理されていない残りのプログラムのこと sum = 0 for num in 1..10 do sum += num sum end 1回目のループのここまで処理した場合、 2回目のループ以降の処理のことを「継続」 と呼ぶ
Slide 10
Slide 10 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」と「Fiber」について ● 「継続」を変数として扱えるように(*) 実装したものが 「Fiber」 ● 他言語では「co-routine」という名前で実装されている 場合もある 「継続」の概念自体はどの言語にも存在するが、 第一級オブジェクトとして扱えるとは限らない (*) 「第一級オブジェクト」と呼びます
Slide 11
Slide 11 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「非同期処理」と「継続」について 非同期処理とは ● 待ち (blocking) が発生した時、処理を一時停止して、 別の処理を行うこと ● 一時停止から戻ってきたあとの処理は「継続」である 「継続」を第一級オブジェクトとして扱えない言語では、 「継続」の処理を関数に切り出し、引数に渡せば「継続」を扱える
Slide 12
Slide 12 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Falcon ● 非同期型イベント駆動アプリケーションサーバ ● 1リクエスト1Fiber ● nio4r(New I/O for Ruby): I/O Selector ● async: 非同期I/Oフレームワーク ● timers: イベントループ用タイマー
Slide 13
Slide 13 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3 Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
Slide 14
Slide 14 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Falcon を触ってみた 今回は下記の処理をするWeb アプリケーションを実装し、 puma と falcon で比較。 ● 外部(raksul.com)にリクエストを投げ、結果を返す ● 1秒 sleep する abを利用して、req/sec を計測。 https://github.com/hkobayash/falcon-sample
Slide 15
Slide 15 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. コード class MyApp < Sinatra::Base get '/' do endpoint = Async::HTTP::URLEndpoint.parse('https://raksul.com') client = Async::HTTP::Client.new(endpoint) response = client.get('/') response.read ensure client.close end get '/sleep' do Async::Task.current.sleep(1) 'Wake Up!' end end
Slide 16
Slide 16 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 外部にリクエストを投げる場合 concurrency 32 64 128 256 512 puma / 1process 128 thread 238.56 req/sec 265.14 req/sec 283.31 req/sec 291.17 req/sec 289.09 req/sec falcon / 1process 176.54 req/sec 190.46 req/sec 189.21 req/sec 188.92 req/sec 181.84 req/sec
Slide 17
Slide 17 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 1秒 sleep する場合 concurrency 32 64 128 256 512 puma / 1process 128 thread 31.95 req/sec 63.84 req/sec 127.57 req/sec 127.42 req/sec 127.55 req/sec falcon / 1process 31.92 req/sec 63.78 req/sec 127.39 req/sec 252.63 req/sec 502.04 req/sec
Slide 18
Slide 18 text
AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. まとめ ● コードそのままで falcon を使うのは(まだ)難しそう ● ドキュメントや例が(まだ)少ないため、どのようなコードを書け ば効率がよいのかよくわからい ● Auto fiber にも期待
Slide 19
Slide 19 text
© RakSul,Inc. All Rights Reserved. AFTER RubyKaigi 2019 仕組みを変えれば、 世界はもっと良くなる Our Vision