連載:〜ScottGu氏のブログより〜

オートスタートするASP.NETアプリケーション(VS 2010&.NET 4シリーズ)

Scott Guthrie 著/Chica
2009/09/24

 本記事は、Microsoftの本社副社長であり、ASP.NETやSilverlightなどの開発チームを率いるScott Guthrie氏のブログを翻訳したものです。氏の許可を得て転載しています。

 これは、VS 2010および.NET 4リリースに向けたブログ投稿シリーズの第7弾です。

 新しいVS 2010のツール機能から切り替えて、代わりに新しいランタイムの機能をカバーする投稿をいくつか行っていくつもりです(ご心配なく、ほかの多くのVSの機能にも、また戻ります。いまはちょっといろいろ織り交ぜてみようと思っています)。

 本日の投稿では、小さいけれども素晴らしい新機能で、ASP.NET 4でオプションとして活用できる機能をカバーします。この機能は、外部のクライアントがWebサーバをヒットするのを待つことなく、自動的にWebアプリケーションを立ち上げ、積極的に初期化します。これにより、サーバをヒットする最初のユーザーにも速いレスポンスの提供が可能になり、サーバを“ウォームアップ”してデータのキャッシュを準備するような独自のスクリプトを書く必要もなくなります。これは、ASP.NET WebフォームおよびASP.NET MVCベースのアプリケーションを含むすべてのタイプのASP.NETアプリケーションで動作します。

ASP.NET 4におけるオートスタートのWebアプリケーション

 いくつかのWebアプリケーションでは、リクエストを処理する準備が整う前に、大量のデータのロードや重い初期化プロセスの実行を行う必要があります。現在のASP.NETを利用する開発者はこれを行うために、アプリケーションのGlobal.asaxファイル内で“Application_Start”イベント・ハンドラをよく使用します(これは最初のリクエストが処理されるときに開始します)。そして、独自のスクリプトを工夫して偽のリクエストをアプリケーションに送信し、顧客がヒットする前に、そのコードを定期的に“呼び起こして”実行するようにします。あるいは単純に、リクエストの処理の前に、このロジックが完了するまで不幸な最初の顧客にアプリケーションへのアクセスを待ってもらいます(これは長い遅延につながります)。

 ASP.NET 4は“オートスタート”と呼ばれる新機能とともに出荷されます。これはこのシナリオをよりうまく処理するもので、IIS 7.5(Windows 7またはWindows Server 2008 R2で出荷)上でASP.NET 4が起動しているときに利用可能です。このオートスタート機能は、アプリケーションのワーカープロセスを立ち上げ、ASP.NETアプリケーションを初期化し、そしてHTTPリクエストを受理するための、制御可能なアプローチを提供します。

ASP.NET 4アプリケーションをオートスタートとして構成

 ASP.NET 4のオートスタート機能を使うには、Webサーバがアプリケーションを最初にロードしたときに自動的に立ち上がるように、それが実行されるIISの“アプリケーション・プール”ワーカープロセスをまず構成します。これを行うには、IIS 7.5のapplicationHost.configファイル(C:\Windows\System32\inetsrv\config\applicationHost.config)を開いて、startMode="AlwaysRunning"属性を適切な<applicationPools>へ追加します。

<applicationPools>
  <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

 Windowsタスク・マネージャを起動して“全ユーザーのプロセスを表示する”チェックボックスをクリックしておき、applicationHost.configファイルにstartMode属性の変更を保存すると、そのファイルの保存と同時に、すぐに新しい“w3wp.exe”ワーカープロセスが起動するのを確認できます。

 1つのIISアプリケーション・プールのワーカープロセスでは、複数のASP.NETアプリケーションをホストできます。そのワーカープロセスがロードされたときに、どのアプリケーションを自動的に開始させるかは、<application>構成にserviceAutoStartEnabled="true"属性を追加することで指定できます。

<sites>
  <site name="MySite" id="1">
    <application path="/"
        serviceAutoStartEnabled="true"
        serviceAutoStartProvider="PreWarmMyCache" />
  </site>
</sites>

<serviceAutoStartProviders>
  <add name="PreWarmMyCache" type="PreWarmCache, MyAssembly" />
</serviceAutoStartProviders>

 上記のserviceAutoStartProvider="PreWarmMyCache"属性は、configファイルに登録されたプロバイダを参照しています。そのファイルで独自のクラスを構成でき、それはアプリケーションに対して“ウォームアップ”ロジックをカプセル化するために使用できます。このクラスは(外部のWebリクエストが受理される前に)、ワーカープロセスとアプリケーションがプリロードされるとすぐ自動的に起動され、リクエストが受理され処理される前に、初期化やキャッシュのロード・ロジックを実行するために使用できます。

public class PreWarmCache
            : System.Web.Hosting.IProcessHostPreloadClient {
  public void Preload(string[] parameters) {
    // ここで初期化およびキャッシュのロード・ロジックを実行……
  }
}

 IISは“ウォームアップ”ロジックが完了するまで、リクエストを受け入れない状態でアプリケーションを開始します。初期化のコードがPreloadメソッドで実行されると、ASP.NETアプリケーションはリクエストを処理できる状態になっているものとしてマークされます。

 オプションとして、この新しいオートスタート“ウォームアップ”機能とIIS7アプリケーション・リクエスト・ルーティング(ARR)拡張のロードバランス機能を組み合わせることができ、アプリケーションが初期化されHTTPトラフィックの受け入れ準備ができたら、それをロード・バランサーへのシグナルとして使用できます。つまりその時点で、リクエストを処理するために、そのサーバはWebファームに参加できます。

まとめ

 ASP.NET 4とIIS 7.5の新しい“オートスタート”機能はよく練られたアプローチであり、エンドユーザーがアプリケーションをヒットする前に、重いアプリケーションのスタートアップや事前キャッシュのロジックを実行できます。これにより、最初からアプリケーションを“ウォームアップ”した状態で準備でき、一定した高いパフォーマンスを提供できるようになります。

 Hope this helps,

 Scott

 P.S. ブログに加え、Twitterを使った素早い投稿やリンクの共有も行っています。http://www.twitter.com/scottguにて、わたしをTwitterでフォローできます(@scottguがわたしのTwitter名です)。End of Article

   
 
インデックス・ページヘ  「〜ScottGu氏のブログより〜」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH