H2Oではバージョン1.5より、mrubyを用い、Rackのインターフェイスに則った形でハンドラを書けるようになっています。
この機能を提供している目的は、正規表現による書き換え等を用いる複雑な設定ファイルではなくプログラミング言語を用いることで、ウェブサーバの設定をより簡潔に拡張しやすくするためです(Apacheのmod_rubyやmod_perlのようにウェブアプリケーションをウェブサーバ内で実行可能にすることではありません)。
とは言っても、現実のウェブサーバの設定においては、外部のデータベース等に問い合わせた結果に基づいたルーティングが必要になることがあります。
H2Oのようなイベントドリブンなウェブサーバ上で動作する、同期モデルを採用するRackインターフェイスを用いて記述されるハンドラ内において、データベースへの問い合わせをどのように実現すれば良いか。問い合わせが同期的だと、その間ウェブサーバの処理が止まってしまうので、Rubyで問い合わせ関数が呼ばれたタイミングで、ウェブサーバ側に処理を戻したいわけです。
そんなこんなで
そのとおりです。mrubyの構造上、Cライブラリ呼出のタイミングで非同期化するの難しそう>「mrubyのコード中でredisへのアクセスが発生した際にh2oがそのスレッドを開放できず、イベントループの恩恵が得られてない」 https://t.co/suTAf8PatM
— Kazuho Oku (@kazuho) November 10, 2015
とツイートしたところ、@kazuho むむむ、どういう改善をすれば「恩恵を得られる」ようになりますかね。改善する意志はあります。
— Yukihiro Matsumoto (@yukihiro_matz) November 10, 2015
@yukihiro_matz @kazuho CからFiberいじれるようにするとかそういう話ですかね。
— MATSUMOTO, Ryosuke (@matsumotory) November 10, 2015
@matsumotory @kazuho yieldとresumeはできますが。後はなにが必要ですか? 作るのはC関数に再入できない問題がありますが、resume同様returnでしか呼べない制限をつければ可能ですね
— Yukihiro Matsumoto (@yukihiro_matz) November 10, 2015
という流れになりました。その後、考えたところ、
@matsumotory @yukihiro_matz rack handlerをfiber内から呼ぶようにすれば、ひょっとしてmrubyに手を入れずに対応できるんじゃないかと考えています
— Kazuho Oku (@kazuho) November 10, 2015
という気がしてきたので、まずはPoCを書いてみることにしました。■Fiberを使って、同期コールを非同期化するPoC
ざっと、以下のような感じになります。Rack ハンドラ自体を Fiber 内に置き、その入出力と、非同期化したい関数(ここでは
DB#query
)が呼ばれたタイミングで Fiber.yield
を呼ぶことで、メインループ(これは実際には C で書くことになる)へ制御を戻しています。# DB class that calls yield class DB def query return Fiber.yield ["db#query"] end end # the application, written as an ordinary Rack handler app = lambda {|env| p "received request to #{env["PATH_INFO"]}" [200, {}, ["hello " + DB.new.query]] } # fiber that runs the app runner = Fiber.new { req = Fiber.yield while 1 resp = app.call(req) req = Fiber.yield ["response", resp] end } runner.resume # the app to be written in C msg = {"PATH_INFO"=> "/abc"} # set request obj while 1 status = runner.resume(msg) if status[0] == "response" resp = status[1] break elsif status[0] == "db#query" # is a database query, return the result msg = "" else raise "unexpected status:#{status[0]}" end end p "response:" + resp[2].join("")
やろうと思えばできることはわかりました。しかし、この手法には制限が2点あります。
- fiber 内からしか呼べない - それでいいのか?
- fiber 内で、Cコードを経由して呼ばれた ruby コードから Fiber.yield できない
■プロトコルバインディングの実装手法
さて、これで行けそうだということは分かったのですが、可能であることと、それが良いアプローチであることが等価であるとは限りません。そもそも、プロトコルバインディングはどのように書かれるべきなのでしょうか。2種類に大別してプロコンを書きたいと思います。
- Cライブラリのラッパーを書く
- Cライブラリが、非同期モデルをサポートしている必要がある
- イベントループ (libuv, libev, ...) 毎に対応が必要
- プロトコルを実装しなくて良い
- rubyでバインディングを書く
- プロトコルを実装する必要がある
- rubyで書ける!
- 各バックエンド (libuv, libev, ngx_mruby, h2o, ...) が同じ ruby API (TCPSocketのサブセットで良いと思う) を提供すれば、イベントループ毎の対応が不要
- Cより遅いかも…
個人的には、rubyでバインディングを書くアプローチが好みです。速度が遅いかも…という点については、Perl IO を用いた HTTP 実装を推進してきた立場から言うと、スクリプト言語のI/Oレイヤの負荷はネットワーク通信を行うプログラムにおいては多くの場合問題にならないと考えます。問題になるとすれば、通信データのパーサですが、ここのみをネイティブコード化するという手法で十分に対応できることは、Plack や Furl に慣れた Perl プログラマであれば納得できる話かと思いますし、(m)ruby においても同等かと思います。
■まとめ
長くなりましたが、H2O (あるいはイベントドリブンなプログラム一般)から、同期的に書かれたネットワーククライアントを呼び出す mruby スクリプトを起動する方法については、
- 同期的に記述されたアプリケーションを Fiber を使ったラッパーで非同期化する
- ホストプログラムは、Fiber を通じて、TCPSocket と互換性のある同期ソケット API を提供する
- プロトコルバインディングは、Rubyで(もしくは、Ruby の TCPSocket と C で書かれたプロトコルパーサを組み合わせて)提供する
ReplyDeleteشركة نقل اثاث بالخبر
شركة نقل اثاث بالقطيف
شركة نقل اثاث بالدمام
شركة نقل عفش بالقطيف
شركة نقل عفش بالاحساء
شركة غسيل مسابح بالدمام
شركة نقل عفش بالطائف
شركات نقل عفش بالدمام
شركة تنظيف خزانات بالمدينة المنورة
شركة نقل عفش بالجبيل
شركة غسيل كنب بالدمام
شركة نقل اثاث بالمدينة المنورة
شركة نقل اثاث بالمدينة المنورة
شركة نظافه بالقطيف
شركة نظافه عامه بالخبر
شركة نقل اثاث بالدمام
March 2016 Calendar Template
ReplyDeletehttp://blog.kazuhooku.com/2015/11/mruby.html
ReplyDeletehappy birthday cakes
ReplyDeleteVery very awesome Article!!!
ReplyDeleteFind out about upcoming easter 2017>>>
Easter USA 2017
Easter Origin
Easter Day 2017
Easter 2017 Canada
Easter Holidays
Easter Monday 2017 Canada
Easter Weekend 2017 Canada
Holidays In Canada
Easter Island
Easter Island Heads
Easter Island History And Mistory
Where Is Easter Island
Easter Egg Hunt
Easter Egg Hunt Game
History Of Easter
History Of Easter Bunny
The Meaning Of Easter
Easter Egg images clip Art Pictures Of Easter Eggs Easter Egg Images Free Download
Happy Easter Images
Easter Images 2017
Happy Easter Images 2017
Easter Story
Easter Story
Meaning Of Easter
How To Celebrate Easter Around The World
Easter Celebration
Easter Facts
Facts About Easter Bunny
Easter Facts Religious
Facts About Easter Eggs
Easter Facts History
Easter Dinner Side Dishes
http://www.ssc10thresults2017.in/
ReplyDeleteBaja tahan karat/korosiAgen Besi Hollow
ReplyDeleteAgen Stainless steel
Harga besi cnp baja
Toko besi beton master steel ms
Supplier besi cnp baja
Supplier besi cnp baja
undangan pernikahan cute
If You Want Watch IPL Live Stream Then Visit www.crickspo.com, it also provide IPL Live ScoreCheck IPL Updates, IPL News, Ball By Ball Score, Men of the atch, men of the series, who won the toss today etc.
ReplyDelete
ReplyDeleteI was looking for some solution on google and then I cam across your website and got addicted. Such a nice way of website management, colours, way of writing and layout is attractive.
ipl live score
ipl score live
free ipl score
ipl final live streaming
ipl final 2018
ipl live streaming
ipl final score
ipl live stream 2018
ipl live score 2018
ipl Schedule 2018
watch ipl online live
ipl live score card
ipl final
ipl live stream
live ipl score
extra cover.net
today ipl live score
Thank you for sharing! Glad to see the information.
ReplyDeleteinstagram viewer
Great content, looking forward to implement all these tips!
ReplyDelete32 inches weave hair
30 inches weave hair
24 inches weave hair
20 inches weave hair
16 inches weave hair
14 inches weave hair
12 inches weave hair
There has been an ascent in the quantity of individuals searching for approaches to address their monetary needs without the assistance of these money related establishments and new openings for work.quick car title loans chicago
ReplyDeleteson of manjeet singh box office collection
ReplyDeleteson of manjeet singh collection
qismat box office collection
saamy square box office collection
student of the year 2
Best Refrigerators at Lowest Price in India 2018-2019 Refrigerator are used in our daily life routine...
Mumbai Call girls
ReplyDeleteMumbai Call girls
Mumbai Call girls
Mumbai Call girls
Mumbai Call girls
Mumbai Call girls
Mumbai Call girls
مثلما يلزم المراعاة بحفظ المدخرات المصنوعة من الزجاج، أو الشاشات ، أو الكريستال ، على نحو أمن جدًا ، واتباع أساليب التغليف الجيد ، لهذه المدخرات.شركة نقل عفش
ReplyDelete