スレッド処理と並列処理を実装する
SDK では、スレッド セーフなタイプとある程度の並列処理を実装しますが、ワークロードで発揮できる最適なパフォーマンスを SDK で出せるように、アプリケーション コードに実装できるベスト プラクティスがあります。
リソース関連のタイムアウトを回避する
多くの場合、要求タイムアウトは、サービス側の問題ではなく、クライアント コンピューターでの CPU またはポートの使用率が高いために発生します。 ローカル リソースの枯渇によって SDK エラーや再試行が発生しないようにするには、クライアント コンピューターのリソース使用率を監視し、適切にスケールアウトすることが重要です。
.NET で async/await を使用する
.NET の C# 言語には、SDK クライアント メソッドを非同期に呼び出す一連のタスクベースの機能が用意されています。 たとえば、CreateDatabaseIfNotExistsAsync メソッドは、次の構文を使用して非同期的に呼び出されます。
Database database = await client.CreateDatabaseIfNotExistsAsync("cosmicworks");
この構文では、await キーワードを使用してタスクを非同期に実行し、その結果を指定された変数に返します。 非同期キーワードを使用すると、SDK による、要求の効率的な同時管理が可能となります。
次のコード例のように、Task.Wait または Task.Result を使用して、非同期実行をブロックしないようにします。
Database database = client.CreateDatabaseIfNotExistsAsync("cosmicworks").Result;
LINQ メソッドではなく、組み込みの反復子を使用する
ToList などの LINQ メソッドは、他の呼び出しの実行をブロックしている間に、クエリを積極的かつ同期的にドレインします。 たとえば、この ToList () を呼び出すと、他のすべての呼び出しがブロックされ、大量のデータが取得される可能性があります。
container.GetItemLinqQueryable<T>()
.Where(i => i.categoryId == 2)
.ToList<T>();
SDK には、他の呼び出しをブロックせずにクエリの結果を非同期に取得するToFeedIterator<T> などのメソッドが含まれています。 この例は、同じシナリオを示していますが、ToList の代わりに特別な反復子を使用しています。
container.GetItemLinqQueryable<T>()
.Where(i => i.categoryId == 2)
.ToFeedIterator<T>();
最大コンカレンシー、並列処理、バッファー項目数を構成する
SDK からクエリを発行する場合、QueryRequestOptions には、クエリのパフォーマンスをチューニングするための一連のプロパティが含まれています。
最大項目数
Azure Cosmos DB for NoSQL のすべてのクエリ結果は、結果の "ページ" として返されます。 このプロパティは、各 "ページ" に返される項目の数を示します。 サービスの既定値は、結果のページごとに 100 項目です。 この値を -1 に設定すると、動的ページ サイズを設定できます。
この例では、MaxItemCount プロパティの値は 500 に設定されています。
QueryRequestOptions options = new ()
{
MaxItemCount = 500
};
ヒント
-1 の MaxItemCount を使用する場合は、応答サイズのサービス制限を超えないようにする必要があります。 たとえば、最大応答サイズは 4 MB です。
最大コンカレンシー
MaxConcurrency では、並列クエリの実行中にクライアント側で実行された同時実行操作の数を指定します。 1 に設定すると、並列処理は実質的に無効になります。 -1 に設定すると、SDK はこの設定を管理します。 この値は、コンテナーの物理パーティションの数に設定するのが理想的です。
この例では、MaxItemCount プロパティの値は 5 に設定されています。
QueryRequestOptions options = new ()
{
MaxConcurrency = 5
};
最大バッファー項目数
MaxBufferedItemCount プロパティでは、並列クエリの実行中にクライアント側でバッファーされる項目の最大数を設定します。 -1 に設定すると、SDK はこの設定を管理します。 この設定の理想的な値は、クライアント コンピューターの特性によって大きく異なります。
この例では、MaxBufferedItemCount プロパティの値は 5,000 に設定されています。
QueryRequestOptions options = new ()
{
MaxBufferedItemCount = 5000
};
注意
これらの設定は、SDK を使用したクエリの発行に関する他の Azure Cosmos DB for NoSQL モジュールで詳細に説明されています。