「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。2014の最終日25日の記事になります。さんの「ngx_mrubyとngx_lua」でした。無事カレンダーの全ての日程が埋まるような結果となり、非常にうれしいです。自分の作ったソフトウェアを使って色々工夫されているのをみて、非常にワクワクしながら全ての記事を読みました。いうわけで今日は最後になるので、mod_mrubyとngx_mrubyの開発で感じていた事、そこからの次の一手として考えついた新しいソフトウェアを紹介したいと思います。mod_mrubyとngx_mruby開発で感じていた事これまでのHTTP/1系で実装されてきた代表的なWebサーバであるApacheやnginxはそれぞれ固有の静的な設定を記述する必要があり、Webサービスの高度化に設定の自由度が追いつかなくなってきていると感じていました。そこで、mrubyの生産性と性能に着目し、mod_mrubyとngx_mrubyという、RubyでWebサーバの振る舞いを制御できるモジュール型ソフトウェアを開発しました。mrubyのアプリ組込みでプログラマブルに設定が書ける事による生産性の向上と性能の両立が高いレベルで実現しつつあると思っています。これからは実際に運用してみて、改善のサイクルを回し、必要な機能があれば追加していくという方向性に進めていく予定です。一方で、既存のWebサーバに後付で実装したために、性能面や自由度で妥協せざるを得ない箇所が複数ありました。Rubyで動的に設定する箇所が限定される生産性と性能の両立と最適化がミドルウェアのモジュール実装に依存する結局ミドルウェア自体の独自の設定記述から逃れられない等が挙げられます。mod_mrubyやngx_mrubyでやっていることというのは、10年も前からされていることで、既存手法の課題の明確化やインタプリタ組込みの最適化という点では新規性があり、スクリプト言語によるWeb機能拡張の一つの答えにはなったと自負していますが、上記の点においてはやはり多くの妥協がありました。mod_mrubyとngx_mrubyの次の一手を考えるmod_mrubyやngx_mrubyのコアが大体出来てきたら、上記の課題を元にどういう未来が考えられるか、次の一手をどう進めるのが良いか、という事をちょうど1年前のこの時期に考えていました。1年前のこの時期は、子供が3月ぐらいに生まれる事がわかっており、29歳最後の月でもありました。20台に代表的なOSSを作るという目標においては、mod_mrubyやngx_mrubyを作る事ができたのですが、すぐ30歳台に突入してしまいます。できれば、子供が生まれるまでに次の一手のソフトウェアのコア部分ぐらいまでは実装しておきたいと考えていました。妥協するぐらいなら1から作ろうそんな時期的な背景があった当時に、上記の問題を考慮し、「妥協するぐらいだったら、1からmrubyに最適化したWebサーバを作ろう」「どうせならHTTP/2で」と思いつくに至りました。そこから設計を色々と考えつつ子供が生まれる3月までに必死で実装し、子供が生まれる当日も部屋で実装しながら妻に陣痛がきていないか部屋を行ったり来たりしながら開発していたのを覚えています。Webサーバを実装するにあたって、コアの設計段階からRubyで全ての設定がかけること、及び、それによって性能を劣化させないようにする事を重視しながら設計・実装しました。mod_mrubyやngx_mrubyを実装することで、Apacheやnginxの内部実装やデータ構造をある程度知っていたので、それらを取り込みつつ、自分のApacheモジュールやnginxモジュールの経験をふんだんに詰め込んで実装しました。いう意味では、mod_mrubyとngx_mrubyの開発で得たWebサーバとmrubyのアプリ組込みに関する知見は、Trusterdの実装において大きく影響しており、昔の苦労が今の実装に活きていると感じました。Webサーバが生まれたのでした。mod_mrubyとngx_mrubyの次の一手はTrusterdTrusterdによって、mod_mrubyやngx_mrubyで妥協していた問題が全てクリア可能になりました。高速に動作する設定はもちろんRubyで全て書けますし、機能拡張もRubyで書けます。本体自体はC言語で実装しており、スクリプト言語で振る舞いを定義できるWebサーバとしては非常に高速に動作します。1から実装している強みもあり、今後も生産性と性能のバランスが取りやすく、自分の実力の範囲内で最適化することができます。妥協する必要はもはやなくなりました。さんが作っていらっしゃいますが、そこのREADMEでもベンチマークでとりあえげて頂き、Rubyで設定が書けたり機能拡張できたりする割りにはかなりの性能が出ている事が分かりました。Fusion昨晩、久々に時間があったのでTrusterdの効率の悪い所を直したので、今のTrusterdだとこのベンチマークの値より2万req/secぐらいは向上するんじゃないかなと思っています。以下のようにも評価を頂き、真面目に実装したかいがあったなと思いました。ありがとうございます。速いな、と驚いた感じです。24全ての設定や機能拡張をRubyでかける続いて、Trusterdでは設定や機能拡張を全てRubyで書けるようにしています。設定のサンプルファイルを以下にざっと載せます。Rubyのサーバみたいですが、内部実装は全てC言語で実装しており、設定、というかWebサーバの振る舞いの定義をmrubyで切り出しているというイメージです。}s.runここでは大体設定の雰囲気だけを掴んで頂ければと思います。TLS有無にも対応しています。基本的には、リクエスト処理の各フェーズで幾つかRubyブロックで記述できるコールバックを用意しており、ある種の機能拡張のフックになっており、そこにRubyのコードを書くことで機能拡張ができます。"#{root_dir}/htdocs/hoge.html"endと書いてやればよかったりします。s.enable_shared_mrubyendなどとかくと、mrubyインタプリタによって解釈されて動的にレスポンスを生成できます。これをmrubyで実行してレスポンスを生成します。world"}HTTP/2で動的コンテンツを使う必要あるのか?という問いですが、個人的には静的コンテンツだけでなく、ちょっとした動的レスポンス、例えばJSONデータを組み立ててレスポンスで返すような場合に、mruby程度の機能と軽量さは非常に適していると考えています。現状でもmrubyのmgemで、JSONや外部データストアを幾つか利用できるので、今後ユーザの触るリッチな部分はデバイスのアプリで実装し、データはWebを介してAPIで取得するようなHTTP/2の時代になってくると予想した場合、この機能は割りと効いてくるんじゃないかと想像しています。HTTP/2はこれまでのHTTPの使い方だけでなく、個人的には様々なミドルウェアが通信するプロトコルとしても有用だと考えていて、mruby程度の機能で動的にレスポンスを生成できるのは、次のステップにも有効なのではないでしょうか。?Trusterdのコアはmrubyのライブラリになっている話は当然そういう流れになっていき、HTTP/2のライブラリやmrubyが動く程度のデバイスや、Cアプリケーション・ミドルウェア上でHTTP/2を実装し、通信したくなるはずです。いう要望にも答えられるように、設計の段階から、Trusterdのコアはmruby-http2と呼ばれるmrubyのHTTP/2モジュールとして実装し、mrubyのHTTP/2サーバ・クライアントライブラリとして完全に分離する事が可能です。HTTP/2のライブラリやmrubyが動く程度のデバイスやアプリケーションにmrubyを組み込めば、自動的にmruby-http2によってHTTP/2でお喋りできるようになるのです。そのために、mruby-http2ではクライアントとサーバ両方の機能を実装しています。いう意味で、Trusterdの実装はHTTP/2のWebサーバ方面だけでなく、mrubyとmruby-http2を組み込む事でデバイスやミドルウェア間での通信にHTTP/2が容易に利用できるという貢献も含まれているのです。Webサーバの紹介をしました。Webサーバの設定をRubyで設定できたり機能拡張できたりすることは非常に生産性が高く、恩恵があると思います。Webサーバやクライアントを容易に実装可能となります。その結果、IoTの世界においてHTTP/2で効率良くデバイス間で通信する世界も近いのではないかとも思っています。mod_mrubyとngx_mrubyの次の一手として、mrubyとHTTP/2を組み合わせたTrusterdを開発することで、専門の違う技術者が協力しながら新たな技術開発が可能となる世界もそこまで来ている気がします。2014の最終日25日の記事になります!今年は自分のソフトウェアのアドベントカレンダーを全て埋めるのが目標だったので、それを達成できて非常に嬉しいです。はてなブログPro研究者と技術者をやっています。詳しくはリンクの「研究・開発業績ページ」を御覧ください。さくらインターネットに入社して1年が経ちました非厳密計算で確率的に解釈するコンピューティングへの流れラストオーサーとしての国際会議投稿やジャーナル執筆のサポートについてviを:wqや:q!、あるいはZZで終了するのとではどちらが効率的か自分の研究開発に自信を持つためには月別アーカイブリンク研究・開発業績ページ旧ブログ検索はてなブログをはじめよう!matsumoto_rさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。