Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
VAN TOEPASSING OP: NoSQL
Deze zelfstudie laat zien hoe u een .NET-consoletoepassing bouwt waarmee de ingerichte doorvoer (RU/s) die nodig is voor het importeren van gegevens in Azure Cosmos DB, wordt geoptimaliseerd.
In dit artikel leest u gegevens uit een voorbeeldgegevensbron en importeert u deze in een Azure Cosmos DB-container.
In deze zelfstudie komt het volgende aan bod:
- Een Azure Cosmos DB-account maken
- Uw project configureren
- Verbinding maken met een Azure Cosmos DB-account waarvoor bulkondersteuning is ingeschakeld
- Een gegevensimport uitvoeren met gelijktijdige maakbewerkingen
Vereiste voorwaarden
Voordat u de instructies in dit artikel uitvoert, moet u zorgen dat u beschikt over de volgende resources:
Een actief Azure-account. Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.
U kunt een gratis Azure Cosmos DB-account maken met de eerste 1000 RU/s en 25 GB opslagruimte. U kunt ook de Azure Cosmos DB-emulator gebruiken met een URI van
https://localhost:8081. Zie Aanvragen verifiëren voor de sleutel die u nodig hebt voor de emulator.NET Core 3 SDK. U kunt controleren welke versie beschikbaar is in uw omgeving door
dotnet --versionuit te voeren.
In deze zelfstudie wordt gebruikgemaakt van versie 3.0+ van de Azure Cosmos DB .NET SDK. Deze is gericht op .NET Framework of .NET Core.
Stap 1: een Azure Cosmos DB-account maken
Maak een Azure Cosmos DB for NoSQL-account vanuit Azure Portal of maak het account met behulp van de Azure Cosmos DB Emulator.
Stap 2: Uw .NET-project instellen
Open de Windows-opdrachtprompt of een Terminalvenster op uw lokale computer. U voert alle opdrachten in de volgende secties uit vanaf de opdrachtprompt of terminal. Voer de volgende nieuwe DotNet-opdracht uit om een nieuwe app te maken met de naam bulk-import-demo.
dotnet new console -n bulk-import-demo
Wijzig uw map in de zojuist gemaakte app-map. U kunt de toepassing maken met:
cd bulk-import-demo
dotnet build
De verwachte uitvoer van de build moet er ongeveer als volgt uitzien:
Restore completed in 100.37 ms for C:\Users\user1\Downloads\CosmosDB_Samples\bulk-import-demo\bulk-import-demo.csproj.
bulk -> C:\Users\user1\Downloads\CosmosDB_Samples\bulk-import-demo \bin\Debug\netcoreapp2.2\bulk-import-demo.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:34.17
Stap 3: Het Azure Cosmos DB-pakket toevoegen
Terwijl u zich nog in de toepassingsmap bevindt, installeert u de Azure Cosmos DB-clientbibliotheek voor .NET Core met behulp van de DotNet-opdracht pakket toevoegen.
dotnet add package Microsoft.Azure.Cosmos
Stap 4: Ontvang de inloggegevens van uw Azure Cosmos DB-account
De voorbeeldtoepassing moet worden geverifieerd bij uw Azure Cosmos DB-account. Als u zich wilt verifiëren, moet u de referenties van het Azure Cosmos DB-account doorgeven aan de toepassing. Haal de referenties van uw Azure Cosmos DB-account op door de volgende stappen te volgen:
- Meld u aan bij het Azure-portaal.
- Navigeer naar uw Azure Cosmos DB-account.
- Open het deelvenster Sleutels en kopieer de URI en PRIMAIRE SLEUTEL van uw account.
Als u de Azure Cosmos DB Emulator gebruikt, haalt u de referenties van de emulator op.
Stap 5: Het CosmosClient-object initialiseren met ondersteuning voor bulkuitvoering
Open het gegenereerde Program.cs-bestand in een code-editor. Maak een nieuw exemplaar van CosmosClient waarvoor bulkuitvoering is ingeschakeld en gebruik deze om bewerkingen uit te voeren op Azure Cosmos DB.
Begin met het overschrijven van de standaardmethode Main en het definiëren van de globale variabelen. Deze globale variabelen omvatten het eindpunt en de autorisatiesleutels, de naam van de database, de container die u maakt en het aantal items dat u bulksgewijs invoegt. Zorg ervoor dat u de waarden voor de eindpunt-URL en de autorisatiesleutel vervangt naar aanleiding van uw omgeving.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Azure.Cosmos;
public class Program
{
private const string EndpointUrl = "https://<your-account>.documents.azure.com:443/";
private const string AuthorizationKey = "<your-account-key>";
private const string DatabaseName = "bulk-tutorial";
private const string ContainerName = "items";
private const int AmountToInsert = 300000;
static async Task Main(string[] args)
{
}
}
Voeg in de methode Main de volgende code toe om het CosmosClient-object te initialiseren:
CosmosClient cosmosClient = new CosmosClient(EndpointUrl, AuthorizationKey, new CosmosClientOptions() { AllowBulkExecution = true });
Notitie
Zodra bulkuitvoering is opgegeven in De CosmosClientOptions, kunnen ze in feite onveranderbaar zijn voor de levensduur van cosmosClient. Het wijzigen van de waarden heeft geen effect.
Nadat de bulkuitvoering is ingeschakeld, worden in de CosmosClient intern gelijktijdige bewerkingen gegroepeerd in enkele serviceaanroepen. Hierdoor wordt het gebruik van de doorvoercapaciteit geoptimaliseerd door serviceaanroepen over partities te verdelen en uiteindelijk individuele resultaten toe te wijzen aan de oorspronkelijke aanroepers.
U kunt vervolgens een container maken om alle items op te slaan. Definieer /pk als de partitiesleutel, 50000 RU/s als ingerichte doorvoer en een aangepast indexeringsbeleid dat alle velden uitsluit om de schrijfdoorvoer te optimaliseren. Voeg de volgende code toe na de CosmosClient-initialisatie-instructie:
Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(Program.DatabaseName);
await database.DefineContainer(Program.ContainerName, "/pk")
.WithIndexingPolicy()
.WithIndexingMode(IndexingMode.Consistent)
.WithIncludedPaths()
.Attach()
.WithExcludedPaths()
.Path("/*")
.Attach()
.Attach()
.CreateAsync(50000);
Stap 6: Een lijst met gelijktijdige taken vullen
Als u de ondersteuning voor bulkuitvoering wilt benutten, maakt u een lijst met asynchrone taken op basis van de gegevensbron en de bewerkingen die u wilt uitvoeren, en gebruikt u Task.WhenAll om deze gelijktijdig uit te voeren.
Laten we beginnen met het gebruik van Bogus-gegevens om een lijst met items uit ons gegevensmodel te genereren. In een echte toepassing zijn de items afkomstig uit de gewenste gegevensbron.
Voeg eerst het pseudopakket aan de oplossing toe met behulp van de DotNet-opdracht pakket toevoegen.
dotnet add package Bogus
Definieer de definitie van de items die u wilt opslaan. U moet de Item klasse definiëren in het Program.cs-bestand :
public class Item
{
public string id {get;set;}
public string pk {get;set;}
public string username{get;set;}
}
Maak vervolgens een Help-functie binnen de klasse Program. Met deze helperfunctie wordt het aantal items opgehaald dat u hebt gedefinieerd om willekeurige gegevens in te voegen en te genereren:
private static IReadOnlyCollection<Item> GetItemsToInsert()
{
return new Bogus.Faker<Item>()
.StrictMode(true)
//Generate item
.RuleFor(o => o.id, f => Guid.NewGuid().ToString()) //id
.RuleFor(o => o.username, f => f.Internet.UserName())
.RuleFor(o => o.pk, (f, o) => o.id) //partitionkey
.Generate(AmountToInsert);
}
Gebruik de helperfunctie om een lijst met documenten te initialiseren waarmee u kunt werken:
IReadOnlyCollection<Item> itemsToInsert = Program.GetItemsToInsert();
Gebruik vervolgens de lijst met documenten om gelijktijdige taken te maken en de takenlijst te vullen om de items in de container in te voegen. Als u deze bewerking wilt uitvoeren, voegt u de volgende code toe aan de klasse Program:
Container container = database.GetContainer(ContainerName);
List<Task> tasks = new List<Task>(AmountToInsert);
foreach (Item item in itemsToInsert)
{
tasks.Add(container.CreateItemAsync(item, new PartitionKey(item.pk))
.ContinueWith(itemResponse =>
{
if (!itemResponse.IsCompletedSuccessfully)
{
AggregateException innerExceptions = itemResponse.Exception.Flatten();
if (innerExceptions.InnerExceptions.FirstOrDefault(innerEx => innerEx is CosmosException) is CosmosException cosmosException)
{
Console.WriteLine($"Received {cosmosException.StatusCode} ({cosmosException.Message}).");
}
else
{
Console.WriteLine($"Exception {innerExceptions.InnerExceptions.FirstOrDefault()}.");
}
}
}));
}
// Wait until all are done
await Task.WhenAll(tasks);
Al deze gelijktijdige puntbewerkingen worden samen uitgevoerd (dat bulksgewijs is) zoals beschreven in de inleidingssectie.
Stap 7: Het voorbeeld uitvoeren
Als u de voorbeeldtoepassing wilt uitvoeren, kunt u dit gewoon doen met de dotnet-opdracht:
dotnet run
De volledige voorbeeldtoepassing ophalen
Als u geen tijd hebt gehad om de stappen in deze zelfstudie uit te voeren of als u alleen de codevoorbeelden wilt downloaden, kunt u deze ophalen van GitHub.
Nadat het project is gekloond, moet u de gewenste referenties in Program.cs bijwerken.
De voorbeeldtoepassing kan worden uitgevoerd door naar de map van de opslagplaats te gaan en met behulp van dotnet:
cd cosmos-dotnet-bulk-import-throughput-optimizer
dotnet run
Volgende stappen
Wilt u capaciteitsplanning uitvoeren voor een migratie naar Azure Cosmos DB? U kunt informatie over uw bestaande databasecluster gebruiken voor capaciteitsplanning.
- Als alles wat u weet het aantal vCores en servers in uw bestaande databasecluster is, leest u meer over het schatten van aanvraageenheden met behulp van vCores of vCPU's
- Als u typische aanvraagtarieven voor uw huidige databaseworkload kent, leest u meer over het schatten van aanvraageenheden met behulp van azure Cosmos DB-capaciteitsplanner