Upgrade to Pro — share decks privately, control downloads, hide ads and more …

糸より軽い(?)繊維の話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 糸より軽い(?)繊維の話

Avatar for Hirotake Kobayashi

Hirotake Kobayashi

May 15, 2019
Tweet

Other Decks in Technology

Transcript

  1. 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
  2. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  3. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  4. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are

    the Right Solution」振り返り YouTube に動画が上がっているので、そちらをどうぞ。 資料:Fibers Are the Right Solution
  5. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「Fibers Are

    the Right Solution」振り返り(3行) • Blocking する処理によりスケーラビリティが損なわれる • スケーラビリティ改善のための Fiber と Falcon という選択肢 • Fiber が正しい選択 出典: Fibers Are the Right Solution
  6. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  7. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Fiber とは?

    • Ruby 1.9 で登場 • Enumerator の内部実装ために実装 • Thread(糸) より軽量という意味で、Fiber(繊維)と名付けられた
  8. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」について •

    計算機科学の概念の一つ • プログラムのある時点で、処理されていない残りのプログラムのこと sum = 0 for num in 1..10 do sum += num sum end 1回目のループのここまで処理した場合、 2回目のループ以降の処理のことを「継続」 と呼ぶ
  9. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「継続」と「Fiber」について •

    「継続」を変数として扱えるように(*) 実装したものが 「Fiber」 • 他言語では「co-routine」という名前で実装されている 場合もある 「継続」の概念自体はどの言語にも存在するが、 第一級オブジェクトとして扱えるとは限らない (*) 「第一級オブジェクト」と呼びます
  10. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 「非同期処理」と「継続」について 非同期処理とは

    • 待ち (blocking) が発生した時、処理を一時停止して、 別の処理を行うこと • 一時停止から戻ってきたあとの処理は「継続」である 「継続」を第一級オブジェクトとして扱えない言語では、 「継続」の処理を関数に切り出し、引数に渡せば「継続」を扱える
  11. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. Falcon •

    非同期型イベント駆動アプリケーションサーバ • 1リクエスト1Fiber • nio4r(New I/O for Ruby): I/O Selector • async: 非同期I/Oフレームワーク • timers: イベントループ用タイマー
  12. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. 本日の内容 3

    Falcon を触ってみた 2 1 「Fibers Are the Right Solution」振り返り Fiber とは?
  13. 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
  14. 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
  15. 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
  16. 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
  17. AFTER RubyKaigi 2019 © RakSul,Inc. All Rights Reserved. まとめ •

    コードそのままで falcon を使うのは(まだ)難しそう • ドキュメントや例が(まだ)少ないため、どのようなコードを書け ば効率がよいのかよくわからい • Auto fiber にも期待