SDK を使用して一括操作を作成する

完了

CosmosClientOptions クラスの新しいインスタンスを作成し、そのインスタンスの AllowBulkExecution プロパティを true に設定することにより、一括実行を有効にする必要があります。

CosmosClientOptions options = new () 
{ 
    AllowBulkExecution = true 
};

この options インスタンスは、CosmosClient コンストラクター パラメーターに最後のパラメーターとして渡すことができます。 この options パラメーターは、エンドポイントとキーのペアを使用している場合に使用できます。

CosmosClient client = new (endpoint, key, options);  

この options パラメーターは、接続文字列コンストラクターを使用している場合にも使用できます。

CosmosClient client = new (connectionString, options);

コンテキストについて、1 つの "項目の作成" 操作を実行するには、通常どうすればよいでしょうか。 ここでは、CreateItemAsync メソッドを呼び出します。それにより Task が返され、今度はそれが await キーワードを使用して直ちに呼び出されます。つまり、Task オブジェクトを実際に処理することはありません。 それはコードを読みやすくするための構文ショートカットにすぎません。

await container.CreateItemAsync<Product>(product, partitionKey);

内部的には、タスク オブジェクトを処理できるほか、リストに追加することもできます。 2 つの製品を作成する 2 つの "項目の作成" 操作のために 2 つのタスクを作成する例を次に示します。 まだタスクを開始していません。これらを後で開始するためにリストに追加します。

List<Task> concurrentTasks = new List<Task>();

PartitionKey firstPartitionKey = new("some-value");
Task<ItemResponse<Product>> firstTask = container.CreateItemAsync<Product>(firstProduct, firstPartitionKey);
concurrentTasks.Add(firstTask);

PartitionKey secondPartitionKey = new("some-value");
Task<ItemResponse<Product>> secondTask = container.CreateItemAsync<Product>(secondProduct, secondPartitionKey);
concurrentTasks.Add(secondTask);

このコードは好ましくない感じがします。これよりも簡潔にすることができます。 ここでは、250,000 個の製品を生成する GetOurProductsFromSomeWhere というメソッドを使用しています。 次に、タスクのリストを作成します。 これで、ほとんどの開発者が簡単に理解できるクリーンな C# の foreach ループを使用できます。

List<Product> productsToInsert = GetOurProductsFromSomeWhere();

List<Task> concurrentTasks = new List<Task>();

foreach(Product product in productsToInsert)
{
    concurrentTasks.Add(
        container.CreateItemAsync<Product>(
            product, 
            new PartitionKey(product.partitionKeyValue))
    );
}

製品リストの各製品について、Azure Cosmos DB for NoSQL コンテナーに項目を作成するタスクを追加します。 どれほど簡単にできるでしょうか。 まだ何も起こっていないことに注意してください。 さらに、container.CreateItemAsync の部分以外に Azure Cosmos DB 固有のコードはまだ書いていません。 これはすべて C# コードです。

Task.WhenAll を呼び出すと、SDK が作動してバッチが作成され、物理パーティション別に操作をグループ化してから、同時に実行するように要求が分散されます。 グループ化操作によって、バックエンド要求の数を減らし、バッチを別々の物理パーティションに並列でディスパッチできるようにすることで、効率が大幅に向上します。 また、クライアント上のスレッド数が減るため、個々のスレッドを使用した個々の操作として実行した場合よりも、多くのスループットを使用することが容易になります。

Task.WhenAll(concurrentTasks);

各バッチが完了すると、SDK によって、バッチはクライアント側アプリケーション向けの結果に変換し直されます。 これはシームレスにであり、開発者に対して透過的です。