インスタンス ストア、クエリ、およびコントロール プロバイダー
インスタンス ストアは、インスタンスの論理コンテナーです。つまり、インスタンス データとメタデータの格納場所です。インスタンス ストアは専用の物理ストレージではありません。インスタンス ストアには、SQL Server データベース内の耐久性のある情報だけでなく、メモリ内の耐久性のない状態情報が含まれることもあります。.NET Framework Version 4 には SQL ワークフロー インスタンス ストアが含まれます。これは、ワークフローのインスタンス データとメタデータを SQL Server 2005 または SQL Server 2008 のデータベースに保持できるように具体的に実装されたインスタンス ストアです。詳細については、.NET Framework ヘルプの「Instance Stores」 (https://go.microsoft.com/fwlink/?LinkId=181533) を参照してください。AppFabric では、ワークフロー サービス インスタンスの SQL Server 2008 データベースへの保持のみをサポートしています。
インスタンス ストアを AppFabric ツール (Windows PowerShell コマンドレットおよび IIS マネージャー拡張機能) やワークフロー管理サービスで使用するには、そのインスタンス ストア用にインスタンス ストア プロバイダー、インスタンス クエリ プロバイダー、およびインスタンス コントロール プロバイダーを開発する必要があります。次に、これらの 3 種類のプロバイダーについて説明します。
ヒント
インスタンス クエリおよびコントロール プロバイダー API は .NET Framework 2.0 に基づいており、インスタンス ストア プロバイダー API は .NET Framework Version 4 に基づいています。
インスタンス ストア プロバイダー
インスタンス ストアのインスタンス ストア プロバイダーによって公開される API が、インスタンス ストア オブジェクトを作成するためにクライアントから呼び出されます。クライアントはインスタンス ストア オブジェクトを使用して、基礎となるインスタンス ストア (SQL Server データベースなど) にワークフロー インスタンスを保存したり、インスタンス ストアからインスタンスを読み込んだりします。
AppFabric には、SQL ワークフロー インスタンス ストア用のインスタンス ストア プロバイダーが含まれます。別のインスタンス ストアをサポートするには、そのインスタンス ストア用にインスタンス ストア プロバイダーを作成する必要があります。インスタンス ストア プロバイダーを作成するには、SqlWorkflowInstanceStore のような、InstanceStoreProvider クラスから派生するクラスを作成して、インスタンス ストアを作成するメソッドを実装する必要があります。詳細については、「操作方法:インスタンス ストア プロバイダーの開発」を参照してください。
インスタンス クエリ プロバイダー
インスタンス ストア用のインスタンス クエリ プロバイダーを使用すると、そのインスタンス ストアに対してクエリを発行できます。Get-ASAppServiceInstance などのコマンドレットを使用してインスタンス ストア内のインスタンスにクエリを実行すると、クエリ プロバイダー オブジェクトが作成され、そのオブジェクトのメソッドが呼び出されます。クエリ プロバイダー オブジェクトはクエリを作成し、インスタンス ストアに対してクエリを実行し、コマンドレットにクエリ結果を返します。AppFabric IIS マネージャー拡張機能では、ほとんどのシナリオでコマンドレットを使用してインスタンス ストアにクエリを実行します。このため、クエリ プロバイダーにも依存しています。
すべてのクエリ プロバイダーが同じ API を実装し、基礎となるさまざまなインスタンス ストア上に抽象レイヤーを提供します。AppFabric には、SQL ワークフロー インスタンス ストア用のインスタンス クエリ プロバイダーが含まれ、SQL Server 永続化データベースに格納されたインスタンスにクエリを実行できます。SQL クエリ プロバイダーがクライアント (Windows PowerShell コマンドレットなど) からクエリを受け取ると、クエリを実行して SQL Server データベースからインスタンスを取得し、結果セットをクライアントに返します。SQL ワークフロー インスタンス ストア用インスタンス クエリ プロバイダーの実装は、Microsoft.ApplicationServer.StoreManagement.dll にあります。
別の種類のインスタンス ストアをサポートするには、そのストア用にインスタンス クエリ プロバイダーを用意する必要があります。カスタム クエリ プロバイダーを作成するには、InstanceQueryProvider クラスから派生するクラスを作成し、クライアントの代理でクエリを実行するメソッドを実装する必要があります。詳細については、「操作方法: インスタンス クエリ プロバイダーの開発」を参照してください。
インスタンス コントロール プロバイダー
インスタンス コントロール プロバイダーを使用すると、クライアントがインスタンス ストア内のインスタンスに対してコントロール コマンドを発行したり、インスタンスに対して実行する必要があるコマンドを取得することができます。AppFabric の Windows PowerShell コマンドレットを使用してインスタンス ストア内のインスタンスを制御 (一時停止や再開など) すると、コントロール プロバイダー オブジェクトが作成され、そのオブジェクトのメソッドが呼び出されてコマンドがコマンド キューに追加されます。コントロール プロバイダーは、インスタンス ストアに格納されたコマンド キューを維持します。ワークフロー管理サービス (WMS) などの汎用ホストでは、コントロール プロバイダー オブジェクトを作成してそのメソッドを呼び出し、コマンド キューに入っているコマンドを取得したりコマンドを実行したりします。WMS は、実行が失敗したか成功したかをコントロール プロバイダーに通知します。実行が成功した場合、コマンドはキューから削除されます。失敗した場合、コントロール プロバイダーに失敗が通知され、適切なアクションがプロバイダーによって実行されます。
インスタンス コントロール プロバイダーは、コマンド キューからコマンドを WMS に転送する以外にも、コマンド発行対象インスタンスに関するメタデータを含むプロパティ バッグを転送します。このプロパティ バッグには、インスタンスのサイト名や仮想サービス パスが含まれます。このメタデータはインスタンス ストアから取得されます。WMS はこのメタデータを使用して、サービス インスタンスによって公開されたインスタンス制御エンドポイント (ICE) にアクセスし、エンドポイントで適切なメソッドを呼び出します。
すべてのコントロール プロバイダーが同じ API を実装し、基礎となるさまざまなインスタンス ストア上に抽象レイヤーを提供します。AppFabric には、SQL ワークフロー インスタンス ストア用のインスタンス コントロール プロバイダーが含まれ、SQL Server 永続化データベースに格納されたインスタンスにコントロール コマンドを発行できます。SQL ワークフロー インスタンス ストア用インスタンス コントロール プロバイダーの実装は、Microsoft.ApplicationServer.StoreManagement.dll にあります。別の種類のインスタンス ストアに格納されたインスタンスへのコマンド発行をサポートするには、そのストア用にインスタンス コントロール プロバイダーを開発する必要があります。
カスタム コントロール プロバイダーを作成するには、InstanceControlProvider クラスから派生するクラスを作成し、クライアントの代理でコマンド キューのコマンドを追加および取得するメソッドを実装する必要があります。詳細については、「操作方法:インスタンス コントロール プロバイダーの開発」を参照してください。
SQL ワークフロー インスタンス ストア用のインスタンス コントロール プロバイダー
AppFabric には、SQL ワークフロー インスタンス ストア用のインスタンス コントロール プロバイダーが含まれます。このインスタンス コントロール プロバイダーは、SQL Server データベース内のコマンド キューを維持します。SQL ワークフロー インスタンス ストアにコントロール コマンドレットを実行すると、インスタンス コントロール プロバイダーは要求を受け取り、コマンド情報を SQL Server データベースのコマンド キューに格納します。WMS はインスタンス コントロール プロバイダーを使用して、コマンド キューからコマンドを取得し、SQL ワークフロー インスタンス ストアにコマンドを実行し、コマンドの実行が成功した場合はコマンド キューからコマンドを削除します。SQL ワークフロー インスタンス ストア用インスタンス コントロール プロバイダーの実装は、Microsoft.ApplicationServer.StoreManagement.dll にあります。
以下の点が、SQL ワークフロー インスタンス ストア用のインスタンス コントロール プロバイダーに当てはまります。
Delete コマンドは即時に (同期的に) 処理されます。その他すべてのコマンドは、コントロール プロバイダーから WMS に渡されて処理されるまで、コマンド キューに入ります。
コマンドキューは先入れ先出し (FIFO) キューです。新しいコマンドはキューの最後に追加され、コマンドは前から読み取られます。ロックされていない最も古いコマンドが WMS に返されます。
コントロール プロバイダーでキューに格納できるコマンドは、インスタンスごとに 1 つだけです。キュー登録を要求されたインスタンスのコマンドがキュー内に既に存在する場合、既存のコマンドがロックされていない場合は既存のコマンドが上書きされます。コマンドがロックされているか、コマンドの状態が "保留中" の場合は、エラーが返されます。
コントロール プロバイダーがコマンド キューからコマンドを読み取った後は、一時的なロックがかかります。このロックは 65 秒後に解除されます。コントロール プロバイダーは、コマンド実行の成功について WMS から通知を受け取ってから、コマンド キューからコマンドを削除します。
コマンドの実行に失敗した場合、コマンドは 5 回試行されます。コマンド キューには実行失敗のカウンターが維持されます。5 回目のコマンド実行に失敗した場合、コマンド キューからコマンドが削除されます。
コントロール プロバイダーは、データベースにコマンド実行エラー ログを維持します。このログには、失敗したコマンドのメタデータと失敗理由が記録されます。ログに記録される失敗コマンドは、インスタンスごとに 1 つまでです。それぞれのログ エントリには、コマンドの種類、インスタンス ID、エラー コード、エラー メッセージ、最終試行日時、コマンドを実行したコンピューターの ID、および試行回数が含まれます。
同じインスタンスの新しいコマンドがキューに登録されるか、インスタンス ストアからそのインスタンスが削除された時点で、インスタンスのログ エントリが削除されます。ユーザーはコマンドレット (Remove-ASAppServiceInstance など) を使用してインスタンスを削除できます。
コントロール プロバイダーでは、コマンド キューからコマンドを 10 個ずつ削除します。
関連項目
概念
操作方法:インスタンス ストア プロバイダーの開発
操作方法: インスタンス クエリ プロバイダーの開発
操作方法:インスタンス コントロール プロバイダーの開発
操作方法: インスタンス ストア プロバイダー、インスタンス クエリ プロバイダー、およびインスタンス コントロール プロバイダーの構成
2011-12-05