テスターですが何か?

ホビープログラマ略してHPです

WebロールとWorkerロールの機能を1インスタンスで動かす(1)

leave a comment »

このエントリーは英語で書かれたWayne Berry氏のブログ「How to Combine a Worker and Web Role in Windows Azure」の日本語訳です。Windows Azure状でWebアプリとバックグランド処理を実行する場合、WebロールとWorkerロールを作成する必要があり、2インスタンス必要になります。(SLAを満たそうとするとするにはそれぞれ2インスタンス必要です)しかし、小規模なアプリケーションであれば、スペック的にインスタンスを分ける必要がないケースがあると思います。また、単純に課金額が倍になってしまうため、非効率と感じるかもしれません。

このエントリーでは、WebロールとWorkerロールを結合して(1つのプロジェクトに両方の機能を持たせて)、1つのインスタンスで動作させる方法を紹介します。WebRole.csファイルにRunメソッドを追加するという単純ん方法ですがこのブログを読んだ時は目からウロコものでした。

——————- ここから日本語訳 —————————-

Windows Azure利用者の中にはごく小さなWebサイトをのせている方もいると思います。また、それぞれのWebサイトには小さなバックグランド処理が必要だと思われれます。通常、Webリクエストの受付にWebロール、バックグランド処理にWorkerロールの2つを、Visual Studioのプロジェクトを分けて作成していると思います。しかし、両方のインスタンスのリソースをフルに活用していなければ、小さなWebサイトの運用は高額に感じられるでしょう。

このエントリーでは、Webロールにバックグランド処理を含める方法を紹介し、Windows Azureのインスタンスのリソースをフルに利用できるようにしようと思います。Workerロールで行なっているであろう典型的なバックグランド処理を実行します。

Windows Azureの稼働時間を最大化するための推奨アプローチは、常に2インスタンスを実行することです。もし、この推奨アプローチに従ったとすると、Webロールに加えて並行して動作するもう一つのバックグランド処理を行うWorkerロールも用意しなければなりません。つまり、バックグランド処理には冪等性(ある操作を1回おこなっても複数回行なっても結果が同じであること)を持たせなければなりません。詳細は「Idempotency for Windows Azure Message Queues」を参照してください。

これからWorkerロールから移動させようとしている処理は、Windows AzureのWebロールのCPUとメモリを消費します。このバックグランド処理はWebリクエストをブロックすることはありません、インスタンス上のリソースを共有します。大量のバックグランド処理を実行したり、大量のリクエストを処理する場合、WebロールとWorkerロールを別のインスタンスに分けるべきでしょう。

Webロールに含めたいと考えているバックグランド処理の例は、セッションステートをクリーンアップする処理(ブログ「Using SQL Azure for Session State」参照)であったり、SQL Azureの日次バックアップを作成する処理(オンプレミスのSQL Serverを利用していれば、SQL Azureで行いたいこと)です。このような処理はリソースに厳しくありません、処理のほとんどの部分はSQL Azureで行われます。しかし、同時にWebのリクエスト/レスポンス処理サイクルのとそ側で実行したいと考えています。

Windows AzureのWebロールは、実際にはHTTPリクエストの受付をおこなすIISトリムを持ったWorkerロールです。Windows Azure上のすべてのロールはRoleEntryPointクラスのサブクラスが呼び出されて開始しまう。Visual Studio 2010で作成されたWebRoleクラスは以下のようになっています。

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }
}

「WebRole.cs」ファイルに上記記述を見つけることができます。Webロールにもこれと似た記述があります。Visual Studioで作成されたWorkerロールはRoleEntryPointのRunメソッドをオーバーライドしています。以下例です。

public override void Run()
{
    // This is a sample worker implementation. Replace with your logic.
    Trace.WriteLine("WorkerRole1 entry point called", "Information");

    while (true)
    {
        Thread.Sleep(10000);
        Trace.WriteLine("Working", "Information");
    }
}

WebロールとWorkerロールを結合する最も簡単は方法は、Visual Studio 2010で最初にWebロールを作成し、その後でRunメソッドをオーバーライドすることです。手順は以下の通りです。

1.Visual Studio 2010を起動します。

2.新規にWindows Azureプロジェクトを作成します。

image

3.ASP.NET MVC2プロジェクトを作成します。

image

4.ファイルが作成されたあと、WebRole.csを開きます。

5.以下のコードを追加して、Runメソッドをオーバーライドします。

        public override void Run()
        {
            // This is a sample worker implementation. Replace with your logic.
            Trace.WriteLine("WorkerRole1 entry point called", "Information");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.WriteLine("Working", "Information");
            }
        }

6.以下2つのアセンブリを使用するためにusing句を追加します。

System.Diagnostics;

System.Threading;

7.保存、ビルドします。

これでWorkerロールとWebロールを結合して1インスタンスで動作させることができました。

MVC3プロジェクトでも同様の方法で可能です、つぎは「WebRole」ファイルが作成されないMVC4プロジェクトでの方法について紹介します。

Written by david9142

2012年1月14日 @ 8:19 AM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。