Implementieren von Threading und Parallelität
Das SDK implementiert zwar threadsichere Typen und ein gewisses Maß an Parallelität, aber es gibt bewährte Methoden, die Sie in Ihrem Anwendungscode implementieren können, um sicherzustellen, dass das SDK die beste Leistung bietet, die es in Ihrer Workload aufweisen kann.
Vermeiden von ressourcenbezogenen Timeouts
Aufgrund einer hohen CPU- oder Portauslastung auf Clientcomputern und nicht aufgrund eines dienstseitigen Problems treten oft Zeitüberschreitungen für Anforderungstimeouts auf. Es ist wichtig, die Ressourcenauslastung auf Clientcomputern zu überwachen und entsprechend zu skalieren, um SDK-Fehler oder Wiederholungen aufgrund der lokalen Ressourcenauslastung zu vermeiden.
Verwenden von async/await in .NET
Die C#-Sprache in .NET verfügt über eine Reihe taskbasierter Features zum asynchronen Aufrufen von SDK-Clientmethoden. Beispielsweise wird die CreateDatabaseIfNotExistsAsync-Methode asynchron mit der folgenden Syntax aufgerufen.
Database database = await client.CreateDatabaseIfNotExistsAsync("cosmicworks");
Diese Syntax verwendet das erwartete Schlüsselwort, um die Aufgabe asynchron auszuführen und das Ergebnis in die angegebene Variable zurückzugeben. Die Verwendung der asynchronen Schlüsselwörter ermöglicht dem SDK, Anforderungen gleichzeitig auf effiziente Weise zu verwalten.
Vermeiden Sie das Blockieren der asynchronen Ausführung mithilfe von Task.Wait oder Task.Result , z. B. im folgenden Beispielcode.
Database database = client.CreateDatabaseIfNotExistsAsync("cosmicworks").Result;
Verwenden integrierter Iteratoren anstelle von LINQ-Methoden
LINQ-Methoden wie ToList leeren eine Abfrage sofort und synchron und blockieren gleichzeitig die Ausführung aller anderen Aufrufe. Beispielsweise blockiert dieser Aufruf von ToList() alle anderen Aufrufe und ruft möglicherweise eine große Datenmenge ab:
container.GetItemLinqQueryable<T>()
.Where(i => i.categoryId == 2)
.ToList<T>();
Das SDK enthält Methoden wie ToFeedIterator<T>, womit die Ergebnisse einer Abfrage asynchron abgerufen werden, ohne andere Aufrufe zu blockieren. Dieses Beispiel veranschaulicht das gleiche Szenario, verwendet jedoch den speziellen Iterator anstelle von ToList.
container.GetItemLinqQueryable<T>()
.Where(i => i.categoryId == 2)
.ToFeedIterator<T>();
Konfigurieren von maximaler Nebenläufigkeit, Parallelität und gepufferter Elementanzahl
Wenn Sie eine Abfrage aus dem SDK ausgeben, enthält die QueryRequestOptions eine Reihe von Eigenschaften, um die Leistung einer Abfrage zu optimieren.
Maximal zulässige Elementanzahl
Alle Abfrageergebnisse in Azure Cosmos DB for NoSQL werden als „Seiten“ mit Ergebnissen zurückgegeben. Diese Eigenschaft gibt die Anzahl der Elemente an, die auf jeder „Seite“ zurückgeben werden sollen. Der Standardwert des Diensts beträgt 100 Elemente pro Ergebnisseite. Sie können diesen Wert auf -1 festlegen, um eine dynamische Seitengröße festzulegen.
In diesem Beispiel wird die MaxItemCount-Eigenschaft auf den Wert 500 festgelegt.
QueryRequestOptions options = new ()
{
MaxItemCount = 500
};
Tipp
Wenn Sie einen maxItemCount-Wert von -1 verwenden, sollten Sie sicherstellen, dass die Gesamtantwort den Dienstgrenzwert für die Antwortgröße nicht überschreitet. Die maximale Antwortgröße beträgt beispielsweise 4 MB.
Maximale Parallelität
MaxConcurrency gibt die Anzahl gleichzeitiger Vorgänge an, die clientseitig während der parallelen Abfrageausführung ausgeführt werden. Wenn der Wert auf 1 festgelegt ist, wird die Parallelität effektiv deaktiviert. Wenn der Wert auf -1 festgelegt ist, verwaltet das SDK diese Einstellung. Im Idealfall legen Sie diesen Wert auf die Anzahl der physischen Partitionen für Ihren Container fest.
In diesem Beispiel wird die MaxConcurrency-Eigenschaft auf den Wert 5 festgelegt.
QueryRequestOptions options = new ()
{
MaxConcurrency = 5
};
Maximale Anzahl gepufferter Elemente
Die MaxBufferedItemCount-Eigenschaft legt die maximale Anzahl von Elementen fest, die clientseitig während einer parallelen Abfrageausführung gepuffert werden. Wenn der Wert auf -1 festgelegt ist, verwaltet das SDK diese Einstellung. Der ideale Wert für diese Einstellung hängt weitgehend von den Eigenschaften Ihres Clientcomputers ab.
In diesem Beispiel wird die MaxBufferedItemCount-Eigenschaft auf den Wert 5.000 festgelegt.
QueryRequestOptions options = new ()
{
MaxBufferedItemCount = 5000
};
Es gibt mehrere bewährte Methoden und Optionen, die Sie in Ihrer Python-Anwendung implementieren können, wenn Sie das Azure Cosmos DB Python SDK verwenden, um eine optimale Leistung für Ihre Workloads sicherzustellen.
Vermeiden von ressourcenbezogenen Timeouts
Viele Anforderungstimeouts treten aufgrund einer hohen CPU- oder Ressourcenauslastung auf Clientcomputern auf und nicht aufgrund von Problemen auf der Azure Cosmos DB-Dienstseite. Überwachen Sie die Ressourcennutzung auf Clientcomputern, und skalieren Sie die Anwendung entsprechend, um SDK-Fehler oder Wiederholungen aufgrund der lokalen Ressourcenauslastung zu vermeiden.
Verwenden asynchroner Abfragen
Das Azure Cosmos DB Python SDK unterstützt asynchrone Vorgänge über das Framework von asyncio Python und stellt Klassen für die asynchrone Programmierung unter dem azure.cosmos.aio Namespace bereit. Sie können z. B. die Methode query_items asynchron verwenden:
from azure.cosmos.aio import CosmosClient
import asyncio
endpoint = "<cosmos-endpoint>"
key = "<cosmos-key>"
client = CosmosClient(endpoint, key)
async def query_items_async(client):
# Get database and container clients
database = client.get_database_client("cosmicworks")
container = database.get_container_client("products")
# Define the query and parameters
query = "SELECT * FROM c WHERE c.categoryId = @categoryId"
parameters = [{"name": "@categoryId", "value": "bikes"}]
# Perform the query asynchronously
async for item in container.query_items(
query=query,
parameters=parameters
):
print(item)
# Close the client
await client.close()
asyncio.run(query_items_async(client))
Bevor Sie die azure.cosmos.aio Klassen für asynchrone Vorgänge verwenden, stellen Sie sicher, dass Sie die aiohttp Bibliothek (pip install aiohttp) installiert haben.
Die Verwendung asyncio stellt sicher, dass mehrere Vorgänge gleichzeitig verarbeitet werden können, ohne die Ausführung von anderem Code zu blockieren.
Vermeiden Sie das Blockieren der asynchronen Ausführung durch unsachgemäßes Mischen synchroner und asynchroner Methoden, Beispiel:
iterator = client.query_items(query=query, parameters=parameters).result() # Incorrect
Verwenden Sie await stattdessen immer für asynchrone Aufrufe.
Verwenden von Iteratoren für Abfragen
Das Python SDK enthält integrierte Iteratoren, um Abfrageergebnisse effizient abzurufen, ohne andere Vorgänge zu blockieren. Vermeiden Sie das Sammeln aller Abfrageergebnisse, da dies zu einer großen Speicherauslastung führen und andere Vorgänge blockieren kann.
Ineffizientes Beispiel:
results = list(container.query_items(
query="SELECT * FROM c WHERE c.categoryId = 'bikes'"
))
Effizientes Beispiel mit einem Iterator:
iterator = container.query_items(
query="SELECT * FROM c WHERE c.categoryId = 'bikes'"
)
async for item in iterator:
print(item)
Mithilfe von Iteratoren können Sie Daten auf speichereffiziente Weise verarbeiten und Ergebnisse verarbeiten, sobald sie eingehen.
Konfigurieren von Abfrageoptionen für die Leistung
Wenn Sie eine Abfrage ausgeben, können Sie mehrere Optionen mit dem Python SDK über die QueryIterable oder query_items Methoden konfigurieren, um die Leistung zu verbessern.
Maximal zulässige Elementanzahl
Alle Abfrageergebnisse in Azure Cosmos DB for NoSQL werden in „Seiten“ mit Ergebnissen zurückgegeben. Der max_item_count Parameter gibt die Anzahl der Elemente an, die auf jeder Seite zurückgegeben werden sollen. Der Dienststandard ist 100 Elemente pro Seite.
Beispiel mit einer max_item_count von 500:
iterator = container.query_items(
query="SELECT * FROM c",
max_item_count=500
)
Tipp
Wenn Sie einen max_item_count von -1verwenden, stellen Sie sicher, dass die Gesamtantwortgröße nicht den Dienstgrenzwert von 4 MB überschreitet.
Partitionsschlüsselverwendung
Schließen Sie nach Möglichkeit den Partitionsschlüssel in den Abfragefilter ein. Dieser Partitionsschlüssel reduziert den Abfragebereich auf eine einzelne Partition, wodurch die Leistung erheblich verbessert wird.
Beispiel:
iterator = container.query_items(
query="SELECT * FROM c WHERE c.categoryId = @categoryId",
parameters=[{"name": "@categoryId", "value": "bikes"}],
partition_key="bikes"
)
Ausführen von Batchvorgängen
Das Python SDK ermöglicht Batchvorgänge für Elemente innerhalb desselben Partitionsschlüssels. Verwenden Sie die TransactionalBatch Klasse, um mehrere Vorgänge atomar auszuführen.
Beispiel:
# Define the partition key and batch operations
partition_key = "socks"
batch = [
("create", ({"id": "sock7", "categoryId": partition_key, "name": "Red Racing Socks"},)),
("create", ({"id": "sock8", "categoryId": partition_key, "name": "White Racing Socks"},))
]
# Execute the batch
batch_response = container.execute_item_batch(batch, partition_key=partition_key)
# Print the resource body results to see the created items
for result in batch_response:
print(result.get("resourceBody"))
Hinweis
Batchvorgänge müssen auf einen einzelnen Partitionsschlüssel abzielen und können eine Größe von bis zu 100 Vorgängen oder 4 MB umfassen.
Es gibt mehrere bewährte Methoden und Optionen, die Sie in Ihrer Anwendung implementieren können, wenn Sie das Azure Cosmos DB JavaScript SDK verwenden, um eine optimale Leistung für Ihre Workloads sicherzustellen.
Vermeiden von ressourcenbezogenen Timeouts
Anforderungstimeouts treten häufig aufgrund einer hohen CPU- oder Ressourcenauslastung auf Clientcomputern und nicht aufgrund von dienstseitigen Problemen auf. Überwachen Sie die Ressourcennutzung auf Clientcomputern, und skalieren Sie die Anwendung entsprechend, um SDK-Fehler oder Wiederholungen durch die lokale Ressourcenauslastung zu vermeiden.
Verwenden asynchroner Abfragen
Das Azure Cosmos DB JavaScript SDK unterstützt asynchrone Vorgänge mithilfe von Zusagen und async/await. Sie können z. B. die Methode createDatabaseIfNotExists asynchron verwenden:
const { CosmosClient } = require("@azure/cosmos");
const client = new CosmosClient({ endpoint: "<cosmos-endpoint>", key: "<cosmos-key>" });
async function createDatabase() {
const { database } = await client.databases.createIfNotExists({ id: "cosmicworks" });
console.log(`Database created: ${database.id}`);
}
createDatabase();
Durch die Verwendung von async/await wird sichergestellt, dass nicht blockierende Vorgänge das SDK dabei unterstützen, mehrere Anforderungen effizient zu verarbeiten.
Vermeiden Sie das Blockieren der asynchronen Ausführung, indem Sie .then() oder .catch() nicht auf eine Weise verwenden, die die Leistung beeinträchtigt.
Verwenden von Iteratoren für Abfragen
Das JavaScript SDK enthält integrierte Iteratoren, um Abfrageergebnisse effizient abzurufen, ohne andere Vorgänge zu blockieren. Vermeiden Sie es, alle Abfrageergebnisse zu sammeln, da dies viel Arbeitsspeicher verwenden und andere Vorgänge blockieren kann.
Ineffizientes Beispiel
const results = await container.items
.query("SELECT * FROM c WHERE c.categoryId = 2", { enableCrossPartitionQuery: true })
.fetchAll();
console.log(results.resources);
Effizientes Beispiel mit einem Iterator
const iterator = container.items.query(
"SELECT * FROM c WHERE c.categoryId = 2",
{ enableCrossPartitionQuery: true }
);
while (iterator.hasMoreResults()) {
const { resources } = await iterator.fetchNext();
for (const item of resources) {
console.log(item);
}
}
Mithilfe von Iteratoren können Sie Ergebnisse in kleineren Batches verarbeiten, wodurch die Speicherauslastung reduziert und die Effizienz verbessert wird.
Konfigurieren von Abfrageoptionen für die Leistung
Wenn Sie eine Abfrage durchführen, können Sie mit dem JavaScript SDK mehrere Optionen über die Methode query konfigurieren, um die Leistung zu verbessern.
Maximal zulässige Elementanzahl
Alle Abfrageergebnisse in Azure Cosmos DB for NoSQL werden in „Seiten“ mit Ergebnissen zurückgegeben. Der maxItemCount Parameter gibt die Anzahl der Elemente an, die auf jeder Seite zurückgegeben werden sollen. Der Dienststandard ist 100 Elemente pro Seite.
Beispiel mit einer maxItemCount von 500:
const iterator = container.items.query(
"SELECT * FROM c",
{ maxItemCount: 500, enableCrossPartitionQuery: true }
);
Tipp
Wenn Sie einen maxItemCount von -1verwenden, stellen Sie sicher, dass die Gesamtantwortgröße nicht den Dienstgrenzwert von 4 MB überschreitet.
Partitionsschlüsselverwendung
Schließen Sie nach Möglichkeit den Partitionsschlüssel in den Abfragefilter ein. Dieser Partitionsschlüssel reduziert den Abfragebereich auf eine einzelne Partition, wodurch die Leistung erheblich verbessert wird.
Beispiel:
const iterator = container.items.query(
{
query: "SELECT * FROM c WHERE c.categoryId = @categoryId",
parameters: [{ name: "@categoryId", value: "socks" }]
},
{ partitionKey: "socks" }
);
Da categoryId auch der Partitionsschlüssel ist, können Sie auch die kompakte Syntax verwenden:
const iterator = container.items.query(
{
query: "SELECT * FROM c"
},
{ partitionKey: "socks" }
);
Ausführen von Batchvorgängen
Das JavaScript SDK ermöglicht Batchvorgänge für Elemente innerhalb desselben Partitionsschlüssels. Verwenden Sie die Methode container.items.batch, um mehrere Vorgänge atomar auszuführen.
Beispiel:
const { CosmosClient, BulkOperationType } = require("@azure/cosmos");
const partitionKey = "bikes";
const operations = [
{
operationType: BulkOperationType.Create,
resourceBody: {
id: "rb3k",
name: "Road Bike 3000",
description: "This is a very fast road bike.",
categoryId: "bikes"
}
},
{
operationType: BulkOperationType.Create,
resourceBody: {
id: "mb2k",
name: "Mountain Bike 2000",
description: "This is a capable and sturdy mountain bike.",
categoryId: "bikes"
}
},
{
operationType: BulkOperationType.Create,
resourceBody: {
id: "tb1k",
name: "Touring Bike 1000",
description: "This is a casual touring bike.",
categoryId: "bikes"
}
}
];
const response = await container.items
.bulk(operations, { partitionKey });
console.log(response);
Hinweis
Batchvorgänge müssen auf einen einzelnen Partitionsschlüssel abzielen und können eine Größe von bis zu 100 Vorgängen oder 2 MB umfassen.
Hinweis
Diese Einstellungen werden in anderen Azure Cosmos DB for NoSQL-Modulen zum Ausgeben von Abfragen mit dem SDK ausführlicher untersucht.