none
AzureでASP.NETのWebサイトのバッチ処理の作り方 RRS feed

  • 質問

  • Azureでのバッチ処理の作り方について教えてください。
    Visual Studio 2013、ASP.NETでWebサイトを構築し、Azureに展開することを検討しています。
    やりたいことは、会員制のWebサイトを構築し、週に一回、会員向けにおしらせメールを送信するというものです。

    まず最初に考えられるのは、Webページ(RESTのようなイメージで)を用意して実行するというものですが、この場合は処理に時間がかかる場合にコネクションタイムアウトになる恐れがあります。

    次に、何かしらのexeファイルを作成してコマンド実行するというものですが、この場合はASP.NETのプロジェクトとは別に、もう一つプロジェクトを作る必要がありそうです。そうすると、DB周りの設定やクラスファイルなど、もう一つ作りこむ必要があり、保守性に欠けると思います。

    phpやRubyの場合、
    php test.php
    ruby test.rb
    などスクリプトファイルを書いて、他のファイルを呼び出すだけでイメージもわきやすいです。

    AzureでASP.NETのWebアプリケーションを構築した場合のバッチ処理は、みなさん、どうされているのでしょうか?

    2014年10月29日 0:50

回答

  • 一般にはWorkerRoleを作るとかだろうと思います。

    WebRoleでもRun実装すればいけるとかだった気がします。
    ※まれにしか実行しない処理ならそれで十分な気もします(WorkerRoleはもったいない)。

    スケジュールされたジョブ機能というのも使えるようです。

    この辺参考になるかもしれません。
    http://www.buildinsider.net/web/webapibatch/01

    --追記

    色々あるみたいですね。私のAzureの知識はちょっと古いので、新しい機能などでより適切なものがあればそちらを使ってください。

    2014年10月29日 2:38
  • AzureでASP.NETのWebアプリケーションを構築した場合のバッチ処理は、みなさん、どうされているのでしょうか?
    私が知っているところでは、SQL Databaseに作成したスケジュール用のテーブルを作成してWorkerロールで定期的(1分以内)に確認することで、スケジュール実行を実現しています。

    他にスケジュールで実行できそうなのは以下が思いつきますが、それぞれで制約事項があると思いますので要件にあったものをチョイスしていただければと思います。

    ・スタートアップタスクにWindowsのタスクスケジューラを設定するスクリプトを仕込む
    ・Azureのオートメーションサービスを使用する
     http://azure.microsoft.com/ja-jp/services/automation/
    ・AzureのAzure Batchサービスを使用する(プレビュー)
     http://azure.microsoft.com/ja-jp/documentation/articles/batch-technical-overview/

    ただ、エラー時のリトライ処理などで○○分後に再実行したい、といったことが要件にある場合は、DBにスケジュール用のテーブルを作成してWorkerロールで実現した方がいろいろなことが出来るんじゃないかなと思います。


    • 編集済み r-cap 2014年10月29日 8:15 表現の変更のため
    • 回答としてマーク さかのうえ 2014年10月31日 0:06
    2014年10月29日 7:43
  • WebSitesのバッチ処理であれば

    KuduのAPIをたたく方法もありますが、

    最近PreviewがはずれたWeb Jobsの利用がよいと思います。

    オンプレのタスクスケジューラでタスクを登録するのとほぼ同じ感覚で利用できます。

    ブチザッキさんのサイトも参考になるかと思います。

    (記事が2014/1/17のものなので、現時点と比べて多少の機能相違にはご注意を)

    ASP.NETのWEB開発では、DAL(Data Access Layer)を疎結合に切り出して、

    バッチ部分はそれを共有して使うことで保守性も高まると思います。

    (詳しい状況がわからないので、当たり障りのない抽象的な回答ですみません)

    2014年10月30日 1:48
  • Azure WebJobsを使うという方法もあると思います。

    そんなに詳しくないので多くは語れませんが、しばやんさんのブログ が参考になると思います。
     http://blog.shibayan.jp/

    ちょうどプレビューが外れたタイミングでエントリ書かれてます(2014/10/19)。

    - Azure WebJobs と WebJobs SDK が正式リリースされたので使い方のコツをメモしておく
     http://blog.shibayan.jp/entry/20141019/1413689099

    2014年10月30日 3:31

すべての返信

  • > 週に一回、会員向けにおしらせメールを送信するというものです。

    Web アプリの中に実装するのではなく、それとは別に Windows Serivce として実装することを検討されてはいかがですか?

    Windows サービス アプリケーションの概要
    http://msdn.microsoft.com/ja-jp/library/d56de412(v=vs.110).aspx

    Web アプリは、基本的に、クライアントの要求に対して応答を返すというものです。クライアントとのやりとり無しで特定機能を実行するのであれば Windows Serivce が適切ではないかと思います。

    もっとも、Azure に Windows Serivce が実装できるかどうかは自分は分かりません。不明なことがあれば、別にスレッドを立てて質問されることをお勧めします。

    2014年10月29日 2:18
  • 一般にはWorkerRoleを作るとかだろうと思います。

    WebRoleでもRun実装すればいけるとかだった気がします。
    ※まれにしか実行しない処理ならそれで十分な気もします(WorkerRoleはもったいない)。

    スケジュールされたジョブ機能というのも使えるようです。

    この辺参考になるかもしれません。
    http://www.buildinsider.net/web/webapibatch/01

    --追記

    色々あるみたいですね。私のAzureの知識はちょっと古いので、新しい機能などでより適切なものがあればそちらを使ってください。

    2014年10月29日 2:38
  • AzureでASP.NETのWebアプリケーションを構築した場合のバッチ処理は、みなさん、どうされているのでしょうか?
    私が知っているところでは、SQL Databaseに作成したスケジュール用のテーブルを作成してWorkerロールで定期的(1分以内)に確認することで、スケジュール実行を実現しています。

    他にスケジュールで実行できそうなのは以下が思いつきますが、それぞれで制約事項があると思いますので要件にあったものをチョイスしていただければと思います。

    ・スタートアップタスクにWindowsのタスクスケジューラを設定するスクリプトを仕込む
    ・Azureのオートメーションサービスを使用する
     http://azure.microsoft.com/ja-jp/services/automation/
    ・AzureのAzure Batchサービスを使用する(プレビュー)
     http://azure.microsoft.com/ja-jp/documentation/articles/batch-technical-overview/

    ただ、エラー時のリトライ処理などで○○分後に再実行したい、といったことが要件にある場合は、DBにスケジュール用のテーブルを作成してWorkerロールで実現した方がいろいろなことが出来るんじゃないかなと思います。


    • 編集済み r-cap 2014年10月29日 8:15 表現の変更のため
    • 回答としてマーク さかのうえ 2014年10月31日 0:06
    2014年10月29日 7:43
  • WebSitesのバッチ処理であれば

    KuduのAPIをたたく方法もありますが、

    最近PreviewがはずれたWeb Jobsの利用がよいと思います。

    オンプレのタスクスケジューラでタスクを登録するのとほぼ同じ感覚で利用できます。

    ブチザッキさんのサイトも参考になるかと思います。

    (記事が2014/1/17のものなので、現時点と比べて多少の機能相違にはご注意を)

    ASP.NETのWEB開発では、DAL(Data Access Layer)を疎結合に切り出して、

    バッチ部分はそれを共有して使うことで保守性も高まると思います。

    (詳しい状況がわからないので、当たり障りのない抽象的な回答ですみません)

    2014年10月30日 1:48
  • Azure WebJobsを使うという方法もあると思います。

    そんなに詳しくないので多くは語れませんが、しばやんさんのブログ が参考になると思います。
     http://blog.shibayan.jp/

    ちょうどプレビューが外れたタイミングでエントリ書かれてます(2014/10/19)。

    - Azure WebJobs と WebJobs SDK が正式リリースされたので使い方のコツをメモしておく
     http://blog.shibayan.jp/entry/20141019/1413689099

    2014年10月30日 3:31
  • フォーラム オペレーターの星 睦美です。
    さかのうえ さん、こんにちは。

    今回はさかのうえ さんの質問に複数のユーザーからの情報があります。内容を確認いただいて、さらに聞きたい点がありましたら返信をお願いします。フォーラムで参考になった回答には、投稿者から[回答としてマーク] いただければ幸いです。

    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年10月30日 4:15
  • 回答ありがとうございます。

    Windows Serviceとは思いもついていませんでした。確かに通常のWindows Serverを立てるのであれば選択肢の一つですね。あとはAzureで実行できるかどうか。自分でも調べてみます。

    2014年10月31日 0:01
  • 回答ありがとうございます。WebRoleをRun実装できるというのをはじめて知りました。WebRoleを工夫次第で使えるのであればすごく助かります。自分でも調べて勉強してみます。
    2014年10月31日 0:03
  • 回答ありがとうございます。エラー時のリトライまで考慮するとWorkerロールがもっとも現実的な実装が可能そうですね。一番最初にこちらで試してみようと思います。
    2014年10月31日 0:06
  • 回答ありがとうございます。Web Jobsを初めて知りました。「ブチザッキさんのサイト」もわかりやすかったです。こちらも実装検討したいと思います。
    2014年10月31日 0:08
  • 回答ありがとうございます。こちらのWebJobsの記事もわかりやすくていいですね。ぜひ参考にさせてもらいます。
    2014年10月31日 0:10