Optimaliseren van Prestaties in Azure Cosmos DB: Beste Praktijken en Tips

Wanneer we met een database werken, is optimalisatie cruciaal en essentieel voor de prestaties en efficiëntie van de applicatie. Evenzo is optimalisatie in Azure Cosmos DB cruciaal voor het maximaliseren van efficiëntie, het minimaliseren van kosten en het waarborgen dat uw applicatie effectief schaalt. Hieronder staan enkele van de beste praktijken met codevoorbeelden om de prestaties in Azure Cosmos DB te optimaliseren.

1. Selectie van de Juiste Partition Key

Het kiezen van een geschikte partition key is van vitaal belang voor gedistribueerde databases zoals Cosmos DB. Een goede partition key zorgt ervoor dat gegevens gelijkmatig over de partities worden verdeeld, waardoor hot spots worden verminderd en de prestaties verbeteren.

De selectie van een partition key is eenvoudig maar zeer belangrijk tijdens het ontwerpproces in Azure Cosmos DB. Zodra we de partition key selecteren, is het niet mogelijk om deze ter plaatse te wijzigen.

Beste Praktijk

  • Selecteer een partition key met hoge cardinaliteit (veel unieke waarden).
  • Zorg ervoor dat deze de lees- en schrijftaken gelijkmatig verdeelt.
  • Houd gerelateerde gegevens samen om cross-partitiequery’s te minimaliseren.

Voorbeeld: Een Container Creëren Met een Optimale Partition Key

C#

 

var database = await cosmosClient.CreateDatabaseIfNotExistsAsync("YourDatabase");
var containerProperties = new ContainerProperties
{
    Id = "myContainer",
    PartitionKeyPath = "/customerId"  // Partition key selected to ensure balanced distribution
}; 

// Maak de container met 400 RU/s beschikbare doorvoer
var container = await database.CreateContainerIfNotExistsAsync(containerProperties, throughput: 400);

2. Correct Gebruik Indexering

In Azure Cosmos DB worden indexes standaard toegepast op alle eigenschappen, wat voordelig kan zijn maar kan leiden tot hogere opslag- en RU/s-kosten. Om de query-prestaties te verbeteren en kosten te minimaliseren, overweeg om het indexeerbeleid aan te passen. Cosmos DB ondersteunt drie soorten indexes: Bereikindexes, Ruimtelijke Indexes en Samengestelde Indexes. Gebruik het juiste type verstandig.

Beste Praktijk

  • Sluit onnodige velden uit van indexering.
  • Gebruik samengestelde indexes voor query’s met meerdere velden.

Voorbeeld: Aangepast Indexeerbeleid

C#

 

{
    "indexingPolicy": {
        "automatic": true,
        "indexingMode": "consistent",  // Can use 'none' or 'lazy' to reduce write costs
        "includedPaths": [
            {
                "path": "/orderDate/?",  // Only index specific fields like orderDate
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "Number"
                    }
                ]
            }
        ],
        "excludedPaths": [
            {
                "path": "/largeDataField/*"  // Exclude large fields not used in queries
            }
        ]
    }
}

Voorbeeld: Toevoegen van een Samengestelde Index voor Geoptimaliseerde Query’s

C#

 

{
    "indexingPolicy": {
        "compositeIndexes": [
            [
                { "path": "/lastName", "order": "ascending" },
                { "path": "/firstName", "order": "ascending" }
            ]
        ]
    }
}

Meer informatie over indexeringstypen kun je hier vinden.

3. Optimaliseer Query’s

Efficiënt queryen is cruciaal om het aantal request units (RU/s) te minimaliseren en de prestaties in Azure Cosmos DB te verbeteren. De RU/s-kosten zijn afhankelijk van de complexiteit en omvang van de query.

Het gebruik van bulk-uitvoerders kan de kosten verder verlagen door het aantal RUs per bewerking te verminderen. Deze optimalisatie helpt RU-gebruik effectief te beheren en verlaagt uw algehele Cosmos DB-kosten.

Beste Praktijk

  • Gebruik SELECT queriesin beperkte hoeveelheden, haal alleen de noodzakelijke eigenschappen op.
  • Vermijd cross-partition queries door de partitiesleutel in uw query te verstrekken.
  • Gebruik filters op geïndexeerde velden om querykosten te verlagen.

Voorbeeld: Haal Klantrecord op

C#

 

var query = new QueryDefinition("SELECT c.firstName, c.lastName FROM Customers c WHERE c.customerId = @customerId")
    .WithParameter("@customerId", "12345");

var iterator = container.GetItemQueryIterator<Customer>(query, requestOptions: new QueryRequestOptions
{
    PartitionKey = new PartitionKey("12345")  // Provide partition key to avoid cross-partition query
});

while (iterator.HasMoreResults)
{
    var response = await iterator.ReadNextAsync();
    foreach (var customer in response)
    {
        Console.WriteLine($"{customer.firstName} {customer.lastName}");
    }
}

4. Afstemming van Consistentieniveaus

De consistentieniveaus definiëren specifieke operationele modi die zijn ontworpen om snelheidsgaranties te bieden. Er zijn vijf consistentieniveaus (Sterk, Begrensde Stalheid, Sessie, Consistente Prefix en Uiteindelijk) beschikbaar in Cosmos DB. Elk consistentieniveau heeft invloed op latentie, beschikbaarheid en doorvoer.

Beste Praktijk

  • Gebruik Sessieconsistentie voor de meeste scenario’s om prestaties en gegevensconsistentie in balans te brengen.
  • Sterke consistentie garandeert gegevensconsistentie maar verhoogt RU/s en latentie.

Voorbeeld: Instellen van Consistentieniveau

C#

 

var cosmosClient = new CosmosClient(
    "",
    "",
    new CosmosClientOptions
    {
        // Stel consistentie in op "Sessie" voor gebalanceerde prestaties
		ConsistencyLevel = ConsistencyLevel.Session      
});

Lees meer over het consistentieniveau hier.

5. Gebruik Provisioned Throughput (RU/s) en Auto-Scale verstandig

Het provisioneren van throughput is een sleutelfactor bij het bereiken van zowel kostenefficiëntie als optimale prestaties in Azure Cosmos DB. De service stelt u in staat om throughput op twee manieren te configureren:

  • Vaste RU/s: Een vooraf gedefinieerd, constant niveau van Request Units per seconde (RU/s), geschikt voor workloads met consistente prestatie-eisen.
  • Auto-Scale: Een dynamische optie die de throughput automatisch aanpast op basis van workload fluctuaties, waardoor schaalbaarheid wordt geboden en overprovisionering tijdens perioden van lage activiteit wordt vermeden.

Het kiezen van het juiste throughput-model helpt om prestatiebehoeften effectief in balans te brengen met kostenbeheer.

Best Practice

  • Voor voorspelbare workloads, provisioneer throughput handmatig.
  • Gebruik auto-scale voor onvoorspelbare of bursty workloads.

Voorbeeld: Provisioning Throughput Met Auto-Scale

C#

 

var throughputProperties = ThroughputProperties.CreateAutoscaleThroughput(maxThroughput: 4000);  // Autoscale up to 4000 RU/s 
var container = await database.CreateContainerIfNotExistsAsync(new ContainerProperties
{
	Id = "autoscaleContainer",
	PartitionKeyPath = "/userId"
}, throughputProperties);

Voorbeeld: Handmatig Instellen van Vaste RU/s voor Stabiele Workloads 

C#

 

var container = await database.CreateContainerIfNotExistsAsync(new ContainerProperties
{
    Id = "manualThroughputContainer",
    PartitionKeyPath = "/departmentId"
}, throughput: 1000);  // Fixed 1000 RU/s

6. Maak gebruik van Change Feed voor Efficiënte Real-Time Verwerking

De wijzigingsfeed maakt real-time, gebeurtenisgestuurde verwerking mogelijk door automatisch wijzigingen in de database vast te leggen, waardoor polling niet meer nodig is. Dit vermindert de overhead van query’s en verhoogt de efficiëntie.

Beste praktijk

  • Gebruik de wijzigingsfeed voor scenario’s waarin real-time gegevenswijzigingen moeten worden verwerkt (bijv. real-time analyses, meldingen, waarschuwingen).

Voorbeeld: Lezen van de wijzigingsfeed

C#

 

var iterator = container.GetChangeFeedIterator(
ChangeFeedStartFrom.Beginning(),
ChangeFeedMode.Incremental);
while (iterator.HasMoreResults)
{
    var changes = await iterator.ReadNextAsync();
    foreach (var change in changes)
    {
        Console.WriteLine($"Detected change: {change.Id}");
        // Verwerk de wijziging (bijv. trigger gebeurtenis, werk cache bij)
    }
}

7. Gebruik van Time-to-Live (TTL) voor automatische gegevensverval

Als u gegevens hebt die slechts tijdelijk relevant zijn, zoals logboeken of sessiegegevens, kan het inschakelen van Time-to-Live (TTL) in Azure Cosmos DB helpen om de opslagkosten te beheersen. TTL verwijdert automatisch verlopen gegevens na de opgegeven bewaartermijn, waardoor handmatige gegevensschoonmaak niet meer nodig is. Deze aanpak vermindert niet alleen de hoeveelheid opgeslagen gegevens, maar zorgt er ook voor dat uw database is geoptimaliseerd voor kostenefficiëntie door verouderde of onnodige informatie te verwijderen.

Beste praktijk

  • Stel TTL in voor containers waar gegevens automatisch moeten vervallen om opslagkosten te verlagen.

Voorbeeld: Time-to-Live (TTL) instellen voor vervallende gegevens

C#

 

{
    "id": "sessionDataContainer",
    "partitionKey": { "paths": ["/sessionId"] },
    "defaultTtl": 3600  // 1 hour (3600 seconds)
}

In Cosmos DB,de maximale Time-to-Live (TTL) waarde die kan worden ingesteld is 365 dagen (1 jaar). Dit betekent dat gegevens automatisch kunnen worden verwijderd nadat ze verlopen zijn binnen een jaar na creatie of laatste wijziging, afhankelijk van hoe u TTL configureert.

8. Vermijd Query’s over Partities

Query’s over partities kunnen de RU/s en latentie aanzienlijk verhogen. Om dit te voorkomen:

Beste Praktijk

  • Neem altijd het partitiesleutel op in uw query’s.
  • Ontwerp uw partitiestrategie om de toegang tot verschillende partities te minimaliseren.

Voorbeeld: Queryen met Partitiesleutel om Query’s over Partities te Vermijden

C#

 

var query = new QueryDefinition("SELECT * FROM Orders o WHERE o.customerId = @customerId")
    .WithParameter("@customerId", "12345"); 

var resultSetIterator = container.GetItemQueryIterator<Order>(query, requestOptions: new QueryRequestOptions
{
    PartitionKey = new PartitionKey("12345")
});

while (resultSetIterator.HasMoreResults)
{
    var response = await resultSetIterator.ReadNextAsync();
    foreach (var order in response)
    {
        Console.WriteLine($"Order ID: {order.Id}");
    }
}

Conclusie

Deze tips zijn zeer effectief tijdens ontwikkeling. Door het implementeren van een effectieve partitiestrategie, aanpassen van indexeerbeleid, optimaliseren van query’s, aanpassen van consistentieniveaus en selecteren van de juiste doorvoerprovisioneringsmodellen, kunt u de prestaties en efficiëntie van uw implementatie van Azure Cosmos DB aanzienlijk verbeteren. Deze optimalisaties verbeteren niet alleen de schaalbaarheid, maar helpen ook bij het beheren van kosten terwijl ze een database-ervaring met hoge prestaties bieden.

Source:
https://dzone.com/articles/optimizing-performance-in-azure-cosmos-db