Microsoft Azure WebJobs SDK の 0.5.0-beta プレビューを発表


このポストは、9 月 6 日に投稿された Announcing the 0.5.0-beta preview of Microsoft Azure WebJobs SDK の翻訳です。

マイクロソフトはこのたび、Microsoft Azure WebJobs SDK プレビューの新しいバージョンをリリースしました。WebJobs SDK については Scott Hanselman 氏がこちらの記事 (英語) で紹介しています。以前のバージョンの詳細については、こちらの記事を参照してください。

今回のリリースでは、0.4.0-beta に含まれていた基本機能に加えて、さらにいくつか新機能が搭載されています。

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

新しい WebJobs SDK は NuGet ギャラリーからダウンロードできます。NuGet ギャラリーで NuGet Package Manager Console を使用して、パッケージをインストールまたは更新します。

Install-Package Microsoft.Azure.WebJobs –Pre

Microsoft Azure Service Bus のトリガーを使用したい場合は、次のパッケージをインストールしてください。

Install-Package Microsoft.Azure.WebJobs.ServiceBus -Pre

WebJobs SDK とは

Microsoft Azure WebSites の WebJob は、サービスやバックグラウンド タスクなどのプログラムを WebSites で簡単に実行できるようにするための機能で、.exe.cmd.bat などの各種実行形式ファイルを WebSites にアップロードして、トリガーで起動する WebJob または継続的に実行する WebJob として実行することができます。WebJobs SDK なしでバックグラウンド タスクの接続や実行を行うとなると、複雑で膨大な量のプログラミングが必要になりますが、SDK が提供するフレームワークを使用すれば、最低限の量のコードで一般的なタスクを実行できます。

WebJobs SDK のバインディング システムとトリガー システムは、Service Bus だけでなく、Microsoft Azure Storage サービスの BLOB、Queue、Table にも対応しています。バインディング システムを使用すれば、Microsoft Azure Storage オブジェクトに対して読み取りや書き込みを行うコードを簡単に作成できます。トリガー システムは、Queue や BLOB が新しいデータを受け取るたびに、コードに記述されている関数を呼び出します。

今回のプレビューで更新された点

public クラスで定義された public 関数のみをインデックス化

本リリースから、SDK は public クラスに定義されている public 関数のみが参照されるようになります。非 public 関数や 非 public クラスで定義された関数はインデックス化されないため、SDK はこれらの関数を呼び出することはできません。

有効な関数の定義を次に示します。

public class Functions

{

    public static void ProcessQueue([QueueTrigger("input")] string input)

    {

    }

}

以下は、クラスが public ではないので機能しません。

class Functions

{

    public static void ProcessQueue([QueueTrigger("input")] string input)

    {

    }

}

Queue を使用した並列実行

SDK 0.4.0-beta では非同期関数のサポートが追加されました。このサポートの一環として、複数の異なる Queue をリッスンする関数が並列的にトリガーされる並列処理も追加されました。

今回のリリースでは新たに、QueueTrigger 内での Queue のメッセージの並列取得のサポートが追加されています。これにより、関数は Queue をリッスンし (下を参照)、既定である 16 個の Queue のメッセージのバッチを並列的に取得することができます。また、関数は並列で実行されます。

public class Program

{

    static void Main()

    {       

        JobHost host = new JobHost();

        host.RunAndBlock();

    }

    public static void ProcessQueue([QueueTrigger("input")] string input)

    {

    }

}

 

次のコードは、0.4.0-beta と同じ機能を追加するものです。JobHostConfiguration クラスでバッチ サイズを次のように設定できます。

public class Program

{

    static void Main()

    {

        JobHostConfiguration config = new JobHostConfiguration();

        config.Queues.BatchSize= 1;

        JobHost host = new JobHost(config);

        host.RunAndBlock();

    }

}

 

BlobTriggers の処理は 1 回限り

これまでは、より新しい BLOB 出力が生成されるまで BlobTriggers が再処理されるため、BLOB が再処理される場合がありました。

このリリースの SDK では、新しい BLOB が検出されるか、既存の BLOB が更新された場合に限り BlobTrigger が処理されます。

次のコードは、BLOB の作成時または更新時に関数をトリガーする方法を示しています。

public class Program

{

    static void Main()

    { 

        JobHost host = new JobHost();

        host.RunAndBlock();

    }

 

    public static void ProcessBlob([BlobTrigger("test/{name}")] string input)

    {

    }

}

この変更により、BlobTrigger が処理されたら BLOB - Queue のワークフローを起動する、という処理が可能になります。次のコードは、BlobTrigger が処理されると Queue メッセージを作成するようにする方法を示しています。

public class Program

{

    static void Main()

    {

        JobHost host = new JobHost();

        host.RunAndBlock();

    }

 

    public static void BlobToQueue(

        [BlobTrigger("test/{name}")] string input,string name,

        [Queue("newblob")] out string message)

    {

        message = name;

    }

}

SDK は、「azure-webjobs-hosts」という名前のコンテナーを Azure Storage アカウント (AzureWebJobsStorage で指定) に追加します。

SDK は処理を終えた各 BLOB の BLOB レシートを保持し、このコンテナーを使用して各 BLOB のステータスの処理を継続します。

BLOB レシートには処理された BLOB に関する次の情報が格納されています。

  • この BLOB によりトリガーされた関数 (FunctionId)
  • コンテナー名
  • BLOB の種類
  • BLOB 名
  • ETag – BLOB のバージョン

BLOB を強制的に再処理したい場合は、その BLOB の BLOB レシートを「azure-webjobs-hosts」コンテナーから削除します。

下のスクリーンショットには、「azure-webjobs-hosts」コンテナーの処理された BLOB の BLOB レシートが表示されています。

 

 

BLOB の再試行およびエラー処理

今回リリースされた SDK では、BLOB 処理時にエラーが発生した関数の再試行をサポートしています。BlobTrigger が再試行する回数の上限を指定できます (既定は 5 回)。

しきい値に達し、関数の実行回数が 5 回に達すると、SDK は「webjobs-BLOBtrigger-poison」という Queue にメッセージを送信します。この Queue の QueueTrigger を使用して関数をトリガーし、カスタムのエラー処理を実行できます。Queue メッセージには、シリアル化された JSON 文字列として以下の情報が格納されます。

  • FunctionId – BLOB が処理された関数の ID
  • BlobType – BLOB の種類 (ページ BLOB/ブロック BLOB)
  • ContainerName - BLOB のコンテナー名
  • BlobName - BLOB の名前
  • ETag – エラーの原因となった BLOB のバージョン

次の関数は BLOB のエラー処理方法を示しています。

public class Program

{

    static void Main()

    { 

        JobHost host = new JobHost();

        host.RunAndBlock();

    }

 

    public static void ProcessBlob([BlobTrigger("test/{name}")] string input)

    {

        throw new Exception();

    }

    public static void BlobErrorHandler(

        [QueueTrigger("webjobs-blobtrigger-poison")] BlobTriggerErrorMessage message)

    {

 

    }

    public class BlobTriggerErrorMessage

    {

        public string FunctionId { get; set; }

        public string BlobType { get; set; }

        public string ContainerName { get; set; }

        public string BlobName {get; set; }

        public string ETag { get; set; }

    }

}

このサンプルでは、Queue メッセージはシリアル化された JSON 文字列なので、Queue メッセージの型を BlobTriggerPosionMessage というクラスに厳密に指定しています。SDK により、シリアル化された JSON オブジェクトを POCO (Plain Old CLR Object) にバインドできます。

次のコードは、BLOB 処理の再試行回数の設定方法を示しています。これは、Queue の有害メッセージの処理でも使用する構成オブジェクトです。この設定により、BLOB や Queue を処理する関数の再試行回数を制御できます。

public class Program

{

    static void Main()

    { 

        JobHostConfiguration config = new JobHostConfiguration();

        config.Queues.MaxDequeueCount = 2;

        JobHost host = new JobHost(config);

        host.RunAndBlock();

    }

}

サンプル

WebJobs SDK のサンプルは次の場所を参照してください。 https://github.com/Azure/azure-webjobs-sdk-samples (英語)

  • Blob、Table、Queue、および Service Bus でのトリガーやバインディングの使用例をご覧いただけます。
  • PhluffyShuffy というサンプルは画像処理を行う Web サイトです。ユーザーがここに画像をアップロードすると、BLOB ストレージのその画像を処理する関数がトリガーされます。

関連資料

SDK を使用した WebJob の Azure WebSites へのデプロイ

Visual Studio 2013 Update 3 および Azure SDK 2.4 には、WebJob を Azure WebSites に発行するための Visual Studio ツールのサポートが追加されています。詳細については、「Azure WebJob を Azure WebSites にデプロイする方法 (英語)」を参照してください。

0.4.0-beta から 0.5.0-beta への移行時の既知の問題

public クラスで定義された public 関数のみをインデックス化

本リリースから、SDK は public クラスに定義されている public 関数のみを参照するようになります。private 関数や private クラスで定義された関数はインデックス化されないため、この SDKで はこれらの関数を呼び出すことはできません。

フィードバックとヘルプについて

Microsoft Azure Web Sites の WebJob 機能と Microsoft Azure WebJobs SDK は現在プレビュー版です。このプレビュー版の改良に役立つフィードバックをぜひご提供ください。

チュートリアルに直接的には関係のないご質問は、Azure フォーラムASP.NET フォーラム (英語)、または StackOverflow.com (英語) までお寄せください。Twitter の場合は、#AzureWebJobs SDK を付けてフィードバックをお願いします。StackOverflow では「Azure-WebJobsSDK」タグをご使用ください。

Comments (0)

Skip to main content