Freigeben über


WebJobs SDK のプレビューを発表

このポストは、3 月 31 日に投稿された Announcing preview of WebJobs SDK の翻訳です。

編集メモ: 今回は、Azure および ASP.NET 担当プログラム マネージャーを務める Pranav Rastogi による記事をご紹介します。

  • この記事では、Scott Hanselman がこちらのページ (英語) で紹介している Windows Azure WebJobs SDK の更新版のリリースについてお伝えします。

今回のリリースをダウンロードする

WebJobs SDK は、NuGet のギャラリーからダウンロードできます。NuGet Package Manager Console などのコンソール アプリケーションを使用すると、NuGet ギャラリーから下記のようなパッケージをインストールしたり、更新したりすることができます。

WebJobs SDK を使用するシナリオ

ここでは、典型的なシナリオをご紹介します。Windows Azure WebJobs SDK の理解を深めるためにお役立てください。

  • 画像処理などの CPU 負荷の高い作業: Web サイトの一般的な機能には、画像や動画のアップロードが含まれますが、このとき、アップロード後にコンテンツの処理を行う場合があります。
  • キューの処理: Web のフロントエンド サービスがバックエンド サービスと通信する際に、キューが使用されることがよくあります。Web サイトで処理を行う場合、フロントエンド サービスがメッセージをキューにプッシュし、バックエンド サービスがキューからメッセージをプルして処理を実行します。
  • RSS 情報集約: RSS フィードのリストを保持するサイトを所有している場合、バックグラウンド処理によりフィードからすべての記事をプルすることがあります。
  • ログ ファイルの集約や整理を含む、ファイルのメンテナンス: 複数のサイトや別々の時間帯で作成されたログ ファイルが存在し、ジョブの分析を行う前に、これらをまとめたい場合があります。また、古いログ ファイルの整理を毎週行うように、タスクをスケジュール設定することもあります。
  • 電子メール送信などの、バックグラウンドのスレッドで実行する、処理に長い時間がかかるタスク: このようなタスクは、アプリケーションが一定時間以上アイドル状態だと IIS がアプリケーションをリサイクルするため、従来は ASP.NET では不可能でした。しかし、Windows Azure Web サイトに AlwaysOn (英語) が導入されたため、アイドル状態でも Web サイトのリサイクルを防げるようになりました。AlwaysOn (英語) は、サイトがスリープ状態にならないように維持することができるため、処理に長い時間が掛かるタスクやサービスを WebJob や WebJobs SDK で実行できます。

WebJobs SDK の概要

Windows Azure Web サイトの WebJob (英語) は、サービスやバックグラウンド タスクなどのプログラムを Web サイトで簡単に実行できるようにするための機能で、.exe、.cmd、.bat などの各種実行形式ファイルを Web サイトにアップロードしたり、実行したりすることができます。しかし、多くの場合、便利な機能を使用するには複雑なプログラミングが必要です。Windows Azure WebJobs SDK はこれに対応するもので、一般的なタスクを実行するために作成しなければならないコードの量を最小限に抑えます。

WebJobs SDK には、Windows Azure ストレージの BLOB、キュー、およびテーブルと連携して使用できるバインディング システムとトリガー システムがあります。バインディング システムでは、Windows Azure ストレージのオブジェクトの読み書きを行うコードを簡単に作成できます。トリガー システムは、キューや BLOB が新しいデータを受け取るたびに、コードに記述されている関数を呼び出します。

WebJobs SDK には、次のコンポーネントが含まれています。

  • NuGet パッケージ: NuGet パッケージは、作成したコードが Windows Azure ストレージのテーブル、BLOB、およびキューで WebJobs SDK のバインディング システムやトリガー システムを使用できるようにするものです。
  • ダッシュボード: WebJobs SDK の一部は既に Windows Azure Web サイトにインストール済みで、NuGet パッケージで作成されたプログラムにリッチな監視機能と診断機能を提供します。このため、監視や診断を行うためのコードを作成する必要はありません。

SDK の目的

  • バックグラウンド処理を行うときに Windows Azure ストレージを簡単に使用する方法を提供すること。
    • SDK を使用すると、ストレージからのデータの読み書きを行うコードを作成する必要がないため、アプリケーションで Azure ストレージを簡単に利用できます。
  • リッチな診断および監視エクスペリエンスを提供し、ユーザーが診断やログ出力用のコードを作成する必要をなくすこと。

SDK の機能

Azure ストレージ

この SDK は、Azure BLOB、キュー、およびテーブルと連携して動作します。

トリガー機能

キューまたは BLOB への新たな入力が検出されると、関数が実行されます。下に示すスニペットでは、“longqueue” という名前のキューに新たにメッセージが挿入されると、ProcessQueue 関数がトリガーされます。トリガー機能の詳細については、次の記事をお読みください。
https://blogs.msdn.com/b/jmstall/archive/2014/01/28/trigger-bindings-and-route-parameters-in-azurejobs.aspx (英語)

バインディング機能

この SDK ではバインディング機能がサポートされており、C# の BCL の型と Azure ストレージの BLOB、テーブル、キューの間でモデル バインディングを行います。これにより、BLOB、テーブル、およびキューからデータを読み書きする処理が簡単になり、Azure ストレージからのデータの読み書きを実行するための一般的なコードを開発者が習得する必要がなくなります。

  1. 利便性: 最も使いやすい型を選択すると、WebJobs SDK がグルー コードとして働きます。BLOB で文字列操作を行う場合、TextWriter への変換方法を気にすることなく、直接 TextReader および TextWriter にバインドできます。
  2. フラッシュとクローズ: WebJobs SDK は、未処理の出力を自動的にフラッシュおよびクローズします。
  3. ユニットテストが可能: この SDK は、ICloudBlob などではなく TextWriter などの BCL の型のモックとして動作させることができるため、作成したコードのユニット テストが可能です。
  4. 診断機能: ダッシュボードから使用可能なモデル バインディング機能により、パラメーターの使用状況をリアルタイムで診断できます。

現時点では、StreamTextReader/WriterString のバインディングがサポートされています。

Azure ストレージでのバインディング機能の動作の詳細については、BLOB (英語)キュー (英語)テーブル (英語) の各記事をお読みください。

ホスティング機能

Host は実行コンテナーの 1 つで、プログラムで使用されている関数をすべて把握するものです。JobHost オブジェクト (Microsoft.WindowsAzure.Jobs.Host (英語) で入手可能) は、バインディングの読み込み、トリガーのリッスン、および関数の呼び出しを担当します。

WebJob の監視用ダッシュボード

WebJob の実行中は、任意の言語で作成された任意の型でリアルタイムの監視が可能です。これにより、WebJob が実行中であるかどうかを把握したり、特定の WebJob の実行ログを表示したりできます。

この SDK を使用して WebJob を作成すると、プログラム内の関数の診断と監視を行えます。ここで、画像処理を行う “ImageResizeAndWaterMark” という名前の WebJob を作成した場合について考えます。フローは次のようになります。まず、ユーザーが画像を BLOB の “images1-input” コンテナーにアップロードすると、WaterMark 関数がトリガーされます。WaterMark はこの画像を処理した後に images2-input コンテナーに書き込みます。ここで Resize 関数がトリガーされ、画像のサイズ変更が実行された後に “images2-output” という BLOB コンテナーに書き込まれます。この WebJob のコードは次のとおりです。

WebJob を Azure で実行しているときに Windows Azure Web サイトのポータルで [WEBJOBS] タブの “ImageResizeAndWaterMark” というログへのリンクをクリックすると、WebJob のダッシュボードが表示されます。ダッシュボードは SiteExtension なので、https://<自身のサイト>.scm.azurewebsites.net/azurejobs という URL でアクセスできます。SiteExtension にアクセスするには、デプロイメントの認証情報が必要です。SiteExtension へのアクセスの詳細については、Kudu プロジェクトのドキュメントをお読みください。
https://github.com/projectkudu/kudu/wiki/Accessing-the-kudu-service (英語)

関数の実行の詳細

この “ImageResizeAndWaterMark” という WebJob に注目して監視する場合、この関数について次のような詳細情報を確認できます。

  • 関数のパラメーターの種類
  • 関数の実行時間
  • BLOB からの読み込みの所要時間と読み書きのバイト数

呼び出しと再実行

上の例の WaterMark 関数で、何らかの理由により処理が正常に完了しなかった場合、新しい画像をアップロードすると WaterMark を再実行できます。これにより実行チェーンがトリガーされ、Resize が再度呼び出されます。これは、関数同士が複雑に組み合わされている場合に診断や不具合箇所のデバッグに役立ちます。また、ダッシュボードからも関数を呼び出すことができます。

関数の因果関係

上の例では、WaterMark 関数が BLOB に書き込みを実行すると Resize 関数がトリガーされます。ダッシュボードでは、この関数同士の因果関係が表示されます。多数の関数が複雑に絡み合い、新しい入力が検出されるたびにトリガーされるような場合を想像してみれば、この因果関係のグラフが便利であることがおわかりいただけるかと思います。

BLOB の検索

[Search Blobs] をクリックし BLOB を検索すると、該当する BLOB に関する情報を確認できます。ImageResizeAndWaterMark の場合、その BLOB は WaterMark 関数が実行されたために書き込まれました。[Search Blobs] の詳細については、次の記事を参照してください。
https://blogs.msdn.com/b/jmstall/archive/2014/02/19/who-wrote-that-blob.aspx (英語)

サンプル

WebJobs SDK のサンプルは、すべて次の場所でご覧いただけます。
https://aspnet.codeplex.com/SourceControl/latest#Samples/AzureWebJobs/ReadMe.txt (英語)

  • BLOB、テーブル、およびキューでトリガーやバインディングを使用する方法のサンプルをご覧いただけます。
  • PhluffySuffy というサンプルをご用意しています。これは画像処理を行う Web サイトで、ユーザーが写真をアップロードすると関数がトリガーされ、アップロードされた写真に対する処理が BLOB ストレージで実行されます。

ドキュメント

SDK での WebJob のデプロイ

WebJob は、Kudu や Web を使用してデプロイできます。作成した WebJob を Web サイトにデプロイする場合は、プロトタイプ版 (英語) をご確認ください。

0.1.0-alpha1 から 0.2.0-alpha2 までのバージョンの既知の問題

ダッシュボードが 0.2.0-alpha2 でデプロイされた WebJob 以外では使用できない

0.1.0-alpha1 の SDK でデプロイした WebJob のログをダッシュボードから表示しようとすると、「ホストが実行されていません」というような警告が表示される場合があります。これは、今回のリリースの一部として、新バージョンのダッシュボードが Azure Web サイト全体にデプロイされるためです。新しいバージョンでは一部のプロトコルが変更されていて、0.1.0-alpha1 との互換性が保たれていない部分があります。ご使用の WebJob を 0.2.0-alpha2 の NuGet パッケージに更新し、WebJob をデプロイし直すと、このエラーは解消されます。

フィードバックをご提供ください

Windows Azure Web サイトの WebJob 機能 (英語) および Windows Azure WebJobs SDK はプレビューで、まだ正式にはサポートされていません。今後の開発に活用するため、皆様からのフィードバックをお待ちしております。

チュートリアルに直接関係のないご質問は、Windows Azure フォーラムASP.NET のフォーラム (英語)、または StackOverflow.com (英語) までお寄せください。また、Twitter をご利用の際は #AzureWebJobs というハッシュタグをご使用ください。