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

完了

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

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

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

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

このオプション パラメーターは、マネージド ID を使用している場合にも使用できます。

using Azure.Identity;
using Microsoft.Azure.Cosmos;

// Configure the account endpoint
string accountEndpoint = "https://<cosmos-account-name>.documents.azure.com:443/";

// Use DefaultAzureCredential to authenticate with Managed Identity
DefaultAzureCredential credential = new DefaultAzureCredential();

// Create CosmosClient with the account endpoint and Managed Identity
CosmosClient client = new CosmosClient(accountEndpoint, credential);

コンテキストについて、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 によって、バッチはクライアント側アプリケーション向けの結果に変換し直されます。 このアクションはシームレスであり、開発者に対して透過的です。