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