しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET 5 のサーバーから IIS (Helios) が削除された理由

ASP.NET 5 beta8 のリリース前に、割と大きな変更が入りました。IIS (Helios) の削除です。

ちゃんと削除する理由が挙げられているので、適当に意訳して紹介します。

  • Helios 自体が DNX の役割を担ってしまっている
    • WebListener や Kestrel などと異なり、Hosting の機能自体を持っている
  • 複数の異なるホスティングモデルを持つことで開発不可能な問題が発生した
    • シンプルなモデルを採用していく

コードが唯一公開されていないコンポーネントなので推測ですが、とにかく Helios のコードが複雑になりすぎて、さらに DNX や Hosting 周りのコードにまで依存関係を持っていたのではないかと。

以前に紹介した ASP.NET 5 のサーバー関係図が、割とそのまま削除された理由になっていると思います。

IIS (Helios) の部分だけ KLR (DNX) が存在していない、不思議な形になっていること分かります。

更に、開発初期段階では存在していなかった HttpPlatformHandler のリリースも、Helios 削除の理由として関係していたのではないかと思います。

HttpPlatformHandler を使うことで、IIS の機能を利用しつつ Java などのアプリケーションを別プロセス空間で実行することが出来ます。つまり Java と ASP.NET 5 は IIS から同列に扱われるということになります。

最後になってしまいましたが IIS (Helios) を削除するメリットを、また適当に意訳して紹介します。

  • IIS が CLR をホスティングする必要がなくなる
  • Windows Server への ASP.NET コンポーネントのインストールが不要
  • 既存の ASP.NET モジュールは IIS で実行可能で、ASP.NET 5 とは分離される
  • HttpPlatformHandler が独自の環境変数を設定可能なので、DNX 関連の設定が行いやすい
  • 全てのサーバーで統一されたエラーハンドリング
  • コード、挙動が統一される

良いことだらけだし、最初から削除しておけばと考える人もいそうですが、Kestrel と HttpPlatformHandler の発展と Visual Studio の Docker 上デバッグサポートなど、様々な面で開発が進められたことで、Helios の削除が実現可能になったのだと思います。

beta8 からの ASP.NET 5 Stack

IIS (Helios) が削除されて、利用可能なサーバーが Kestrel と WebListener の 2 つになりましたが、IIS の下に付ける場合は Kestrel 一択になりそうです。

理由は単純で WebListener は http.sys を使っているからです。IIS から起動されたプロセスは権限の関係で http.sys を直接触れないようになっています。

Kestrel が本番環境で使えるか不安に感じる人も多いと思いますが、既に ASP.NET チームは Kestrel のみを使ったベンチマークを行い、結果を GitHub で公開しています。

かなりの負荷をかけてテストしているので、殆どのケースで問題が出ることはなさそうです。パフォーマンスに関しても beta7 の時点で ASP.NET 4.6 の 2 倍ほどリクエストを捌けているようです。

おまけ : Helios の OSS 化はない

Twitter で Helios のコードを公開してほしいという話が出ていましたが、David Fowler 氏が絶対にないという感じで返事をしていました。

個人的には IIS Native Module のノウハウが詰まってそうなので、コードを一度見てみたいですが残念です。