Partizionamento e ridimensionamento in Azure Cosmos DBPartition and scale in Azure Cosmos DB

Azure Cosmos DB è un servizio di database multimodello distribuito a livello globale che consente di ottenere prestazioni rapide e prevedibile.Azure Cosmos DB is a globally distributed, multimodel database service designed to help you achieve fast, predictable performance. È ridimensionabile contestualmente all'espansione dell'applicazione.It scales seamlessly along with your application as it grows. Questo articolo offre una panoramica del funzionamento del partizionamento per tutti i modelli di dati in Azure Cosmos DB.This article provides an overview of how partitioning works for all the data models in Azure Cosmos DB. Descrive anche come configurare contenitori Azure Cosmos DB per ridimensionare in modo efficace le applicazioni.It also describes how you can configure Azure Cosmos DB containers to effectively scale your applications.

Il partizionamento e le chiavi di partizione sono illustrati in questo video di Azure Friday con Scott Hanselman e Shireesh Thota, responsabile principale della progettazione di Azure Cosmos DB:Partitioning and partition keys are discussed in this Azure Friday video with Scott Hanselman and Azure Cosmos DB Principal Engineering Manager, Shireesh Thota:

Partizionamento in Azure Cosmos DBPartitioning in Azure Cosmos DB

In Azure Cosmos DB è possibile archiviare dati ed eseguire query senza schema con tempi di risposta nell'ordine di millisecondi su qualsiasi scala.In Azure Cosmos DB, you can store and query schema-less data with order-of-millisecond response times at any scale. Azure Cosmos DB offre contenitori per l'archiviazione di dati denominati raccolte (per i documenti), grafici o tabelle.Azure Cosmos DB provides containers for storing data called collections (for documents), graphs, or tables. I contenitori sono risorse logiche e possono comprendere una o più partizioni fisiche o server.Containers are logical resources and can span one or more physical partitions or servers. Il numero di partizioni è determinato da Azure Cosmos DB in base allo spazio di archiviazione e alla velocità effettiva con provisioning del contenitore.The number of partitions is determined by Azure Cosmos DB based on the storage size and the provisioned throughput of the container. Ogni partizione in Azure Cosmos DB ha una quantità fissa di archiviazione supportata dall'unità SSD associata e viene replicata per la disponibilità elevata.Every partition in Azure Cosmos DB has a fixed amount of SSD-backed storage associated with it and is replicated for high availability. Le partizioni vengono completamente gestite da Azure Cosmos DB e non è necessario scrivere codice complesso o gestire le partizioni.Partition management is fully managed by Azure Cosmos DB, and you don't have to write complex code or manage your partitions. I contenitori di Azure Cosmos DB sono illimitati in termini di risorse di archiviazione e di velocità effettiva.Azure Cosmos DB containers are unlimited in terms of storage and throughput.

Partizionamento delle risorse

Il partizionamento è trasparente per l'applicazione.Partitioning is transparent to your application. Azure Cosmos DB supporta letture e scritture veloci, query, logica transazionale, livelli di coerenza e controllo di accesso con granularità fine tramite metodi/API per una singola risorsa di contenitore.Azure Cosmos DB supports fast reads and writes, queries, transactional logic, consistency levels, and fine-grained access control via methods/APIs to a single container resource. Il servizio gestisce la distribuzione dei dati tra le partizioni e il routing delle richieste di query alla partizione corretta.The service handles distributing data across partitions and routing query requests to the right partition.

Per il partizionamento,How does partitioning work? ogni elemento deve avere una chiave di partizione e una chiave di riga che lo identificano in modo univoco.Each item must have a partition key and a row key, which uniquely identify it. La chiave di partizione funge da partizione logica per i dati e garantisce ad Azure Cosmos DB un limite naturale per la distribuzione dei dati tra partizioni.Your partition key acts as a logical partition for your data and provides Azure Cosmos DB with a natural boundary for distributing data across partitions. In sintesi, il partizionamento in Azure Cosmos DB funziona nel modo seguente:In brief, here's how partitioning works in Azure Cosmos DB:

  • Si esegue il provisioning di un contenitore Azure Cosmos DB con velocità effettiva di T richieste/s.You provision a Azure Cosmos DB container with T requests/s throughput.
  • In background Azure Cosmos DB effettua il provisioning delle partizioni necessarie per gestire T richieste/s.Behind the scenes, Azure Cosmos DB provisions partitions needed to serve T requests/s. Se T è maggiore della velocità effettiva massima per partizione t, Azure Cosmos DB effettua il provisioning di N = T/t partizioni.If T is higher than the maximum throughput per partition t, then Azure Cosmos DB provisions N = T/t partitions.
  • Azure Cosmos DB alloca lo spazio degli hash delle chiavi di partizione in modo uniforme tra le N partizioni.Azure Cosmos DB allocates the key space of partition key hashes evenly across the N partitions. Ogni partizione fisica ospita quindi 1-N valori di chiave di partizione (partizioni logiche).So, each partition (physical partition) hosts 1-N partition key values (logical partitions).
  • Quando una partizione fisica p raggiunge il limite di archiviazione, Azure Cosmos DB suddivide p in due nuove partizioni, p1 e p2.When a physical partition p reaches its storage limit, Azure Cosmos DB seamlessly splits p into two new partitions, p1 and p2. Distribuisce i valori corrispondenti a circa la metà delle chiavi a ogni partizione.It distributes values corresponding to roughly half the keys to each of the partitions. Questa operazione di suddivisione è invisibile all'applicazione.This split operation is invisible to your application.
  • Analogamente, quando si esegue il provisioning di una velocità effettiva superiore a t*N, Azure Cosmos DB suddivide una o più partizioni per supportare la velocità effettiva maggiore.Similarly, when you provision throughput higher than t*N, Azure Cosmos DB splits one or more of your partitions to support the higher throughput.

La semantica delle chiavi di partizione è leggermente diversa in modo da corrispondere alla semantica di ogni API, come illustrato nella tabella seguente:The semantics for partition keys are slightly different to match the semantics of each API, as shown in the following table:

APIAPI Chiave di partizionePartition key Chiave di rigaRow key
Azure Cosmos DBAzure Cosmos DB Percorso personalizzato della chiave di partizioneCustom partition key path id fissoFixed id
MongoDBMongoDB Chiave personalizzata condivisaCustom shared key _id fissoFixed _id
GraficoGraph Proprietà chiave di partizione personalizzataCustom partition key property id fissoFixed id
TabellaTable PartitionKey fissoFixed PartitionKey RowKey fissoFixed RowKey

Azure Cosmos DB usa il partizionamento basato su hash.Azure Cosmos DB uses hash-based partitioning. Quando si scrive un elemento, Azure Cosmos DB esegue l'hashing del valore della chiave di partizione e usa il risultato con hash per determinare la partizione in cui archiviare l'elemento.When you write an item, Azure Cosmos DB hashes the partition key value and uses the hashed result to determine which partition to store the item in. Azure Cosmos DB archivia tutti gli elementi con la stessa chiave di partizione nella stessa partizione fisica.Azure Cosmos DB stores all items with the same partition key in the same physical partition. La scelta della chiave di partizione è una decisione importante da prendere in fase di progettazione.The choice of the partition key is an important decision that you have to make at design time. È necessario scegliere un nome proprietà che contenga un'ampia gamma di valori e abbia anche modelli di accesso.You must pick a property name that has a wide range of values and has even access patterns.

Nota

È consigliabile avere una chiave di partizione con molti valori distinti (centinaia di migliaia come minimo).It's a best practice to have a partition key with many distinct values (hundreds to thousands at a minimum).

I contenitori di Azure Cosmos DB possono essere creati come fissi o illimitati.Azure Cosmos DB containers can be created as fixed or unlimited. I contenitori a dimensione fissa hanno un limite massimo di 10 GB e velocità effettiva di 10.000 UR/s.Fixed-size containers have a maximum limit of 10 GB and 10,000 RU/s throughput. Alcune API consentono di omettere la chiave di partizione per i contenitori a dimensione fissa.Some APIs allow the partition key to be omitted for fixed-size containers. Per creare un contenitore illimitato, è necessario specificare una velocità effettiva minima di 2.500 UR/s.To create a container as unlimited, you must specify a minimum throughput of 2,500 RU/s.

È consigliabile controllare la modalità di distribuzione dei dati nelle partizioni.It is a good idea to check how your data is distributed in partitions. Per eseguire il controllo nel portale, accedere al proprio account Azure Cosmos DB e fare clic su Metrics (Metriche) nella sezione Monitoring (Monitoraggio) e quindi nel riquadro destro fare clic sulla scheda storage (Archiviazione) per visualizzare come sono partizionati i dati nelle diverse partizioni fisiche.To check this in portal, go to your Azure Cosmos DB account and click on Metrics in Monitoring section and then on right pane click on storage tab to see how your data is partitioned in different physical partition.

Partizionamento delle risorse

L'immagine a sinistra mostra il risultato di una chiave di partizione non valida l'immagine a destra mostra il risultato di una chiave di partizione valida.The left image shows the result of a bad partition key and the right image shows the result of a good partition key. Nell'immagine a sinistra è possibile vedere che i dati non sono distribuiti uniformemente tra le partizioni.In left image, you can see the data is not evenly distributed among partitions. È consigliabile distribuire i dati in modo che il grafico sia simile all'immagine di destra.You should strive to distribute your data so your graph looks similar to right image.

Partizionamento e velocità effettiva con provisioningPartitioning and provisioned throughput

Azure Cosmos DB è progettato per prestazioni prevedibili.Azure Cosmos DB is designed for predictable performance. Quando si crea un contenitore, la velocità effettiva viene riservata in termini di unità richiesta (UR) al secondo.When you create a container, you reserve throughput in terms of request units (RU) per second. A ogni richiesta viene assegnato un addebito delle UR proporzionato alla quantità di risorse di sistema, come CPU, memoria e I/O usati dall'operazione.Each request is assigned a RU charge that is proportionate to the amount of system resources like CPU, memory, and IO consumed by the operation. La lettura di un documento di 1 KB con coerenza di sessione usa 1 UR.A read of a 1-KB document with session consistency consumes 1 RU. Un'operazione di lettura corrisponde a 1 RU indipendentemente dal numero di elementi archiviati o dal numero di richieste simultanee in esecuzione contemporaneamente.A read is 1 RU regardless of the number of items stored or the number of concurrent requests running at the same time. Elementi di dimensioni maggiori richiedono più UR a seconda delle dimensioni.Larger items require higher RUs depending on the size. Se si conoscono le dimensioni delle entità e il numero di letture che è necessario supportare per l'applicazione, è possibile eseguire il provisioning della quantità esatta di velocità effettiva necessaria per le esigenze di lettura dell'applicazione.If you know the size of your entities and the number of reads you need to support for your application, you can provision the exact amount of throughput required for your application's read needs.

Nota

Per ottenere la velocità effettiva totale del contenitore è necessario scegliere una chiave di partizione che consenta di distribuire in modo uniforme le richieste tra alcuni valori distinti della chiave di partizione.To achieve the full throughput of the container, you must choose a partition key that allows you to evenly distribute requests among some distinct partition key values.

Uso delle API di Azure Cosmos DBWork with the Azure Cosmos DB APIs

È possibile usare il portale di Azure o l'interfaccia della riga di comando di Azure per creare contenitori e ridimensionarli in qualsiasi momento.You can use the Azure portal or Azure CLI to create containers and scale them at any time. Questa sezione illustra come creare contenitori e specificare la definizione di velocità effettiva e chiave di partizione in ognuna delle API supportate.This section shows how to create containers and specify the throughput and partition key definition in each of the supported APIs.

API di Azure Cosmos DBAzure Cosmos DB API

L'esempio seguente illustra come creare un contenitore (raccolta) usando l'API di Azure Cosmos DB.The following sample shows how to create a container (collection) by using the Azure Cosmos DB API.

DocumentClient client = new DocumentClient(new Uri(endpoint), authKey);
await client.CreateDatabaseAsync(new Database { Id = "db" });

DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "coll";
myCollection.PartitionKey.Paths.Add("/deviceId");

await client.CreateDocumentCollectionAsync(
    UriFactory.CreateDatabaseUri("db"),
    myCollection,
    new RequestOptions { OfferThroughput = 20000 });

È possibile leggere un elemento (documento) tramite il metodo GET nell'API REST oppure usando ReadDocumentAsync in un SDK.You can read an item (document) by using the GET method in the REST API or by using ReadDocumentAsync in one of the SDKs.

// Read document. Needs the partition key and the ID to be specified
DeviceReading document = await client.ReadDocumentAsync<DeviceReading>(
  UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
  new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") });

API di MongoDBMongoDB API

Con l'API MongoDB è possibile creare una raccolta partizionata usando il proprio strumento, driver o SDK preferito.With the MongoDB API, you can create a sharded collection through your favorite tool, driver, or SDK. In questo esempio verrà usato Mongo Shell per la creazione della raccolta.In this example, we use the Mongo Shell for the collection creation.

In Mongo Shell:In the Mongo Shell:

db.runCommand( { shardCollection: "admin.people", key: { region: "hashed" } } )

Risultati:Results:

{
    "_t" : "ShardCollectionResponse",
    "ok" : 1,
    "collectionsharded" : "admin.people"
}

API di tabellaTable API

Con l'API di tabella si specifica la velocità effettiva per le tabelle nella configurazione appSettings dell'applicazione.With the Table API, you specify the throughput for tables in the appSettings configuration for your application.

<configuration>
    <appSettings>
      <!--Table creation options -->
      <add key="TableThroughput" value="700"/>
    </appSettings>
</configuration>

Si crea quindi una tabella usando l'SDK di archiviazione tabelle di Azure.Then you create a table by using the Azure Table storage SDK. La chiave di partizione viene creata implicitamente come valore PartitionKey.The partition key is implicitly created as the PartitionKey value.

CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

CloudTable table = tableClient.GetTableReference("people");
table.CreateIfNotExists();

È possibile recuperare una singola entità tramite il frammento seguente:You can retrieve a single entity by using the following snippet:

// Create a retrieve operation that takes a customer entity.
TableOperation retrieveOperation = TableOperation.Retrieve<CustomerEntity>("Smith", "Ben");

// Execute the retrieve operation.
TableResult retrievedResult = table.Execute(retrieveOperation);

Per altre informazioni, vedere Sviluppare con l'API Table.For more information, see Develop with the Table API.

API GraphGraph API

Con l'API Graph è necessario usare il portale o l'interfaccia della riga di comando di Azure per creare contenitori.With the Graph API, you must use the Azure portal or Azure CLI to create containers. Essendo Azure Cosmos DB multimodello, in alternativa è possibile usare un altro modello per creare e ridimensionare il contenitore di grafici.Alternatively, because Azure Cosmos DB is multimodel, you can use one of the other models to create and scale your graph container.

È possibile leggere qualsiasi vertice o arco usando la chiave di partizione e l'ID in Gremlin.You can read any vertex or edge by using the partition key and ID in Gremlin. Per un grafico con area ("USA") come chiave di partizione e "Seattle" come chiave di riga, ad esempio, è possibile trovare un vertice usando la sintassi seguente:For example, for a graph with region ("USA") as the partition key and "Seattle" as the row key, you can find a vertex by using the following syntax:

g.V(['USA', 'Seattle'])

È possibile fare riferimento a un arco usando la chiave di partizione e la chiave di riga.You can reference an edge by using the partition key and the row key.

g.E(['USA', 'I5'])

Per altre informazioni, vedere Gremlin support for Azure Cosmos DB (Supporto Gremlin per Azure Cosmos DB).For more information, see Gremlin support for Azure Cosmos DB.

Progettazione del partizionamentoDesign for partitioning

Per ridimensionare in modo efficace con Azure Cosmos DB è necessario selezionare una chiave di partizione valida quando si crea il contenitore.To scale effectively with Azure Cosmos DB, you need to pick a good partition key when you create your container. È necessario considerare due aspetti principali nella scelta di una chiave di partizione:There are two main considerations for choosing a partition key:

  • Limite per query e transazioni.Boundary for query and transactions. La scelta della chiave di partizione deve bilanciare la necessità di consentire l'uso di transazioni rispetto al requisito di distribuire le entità tra più chiavi di partizione per garantire una soluzione scalabile.Your choice of partition key should balance the need to enable the use of transactions against the requirement to distribute your entities across multiple partition keys to ensure a scalable solution. Da una parte è possibile impostare la stessa chiave di partizione per tutti gli elementi. Questa opzione potrebbe comunque limitare la scalabilità della soluzione.At one extreme, you can set the same partition key for all your items, but this option might limit the scalability of your solution. Dall'altra è possibile assegnare una chiave di partizione univoca per ogni elemento.At the other extreme, you can assign a unique partition key for each item. Questa scelta è altamente scalabile, ma impedisce di usare transazioni tra documenti tramite stored procedure e trigger.This choice is highly scalable, but it prevents you from using cross-document transactions via stored procedures and triggers. Una chiave di partizione ideale consente di usare query efficienti e dispone di una quantità di cardinalità idonea a garantire la scalabilità della soluzione.An ideal partition key enables you to use efficient queries and has sufficient cardinality to ensure your solution is scalable.
  • Evitare i colli di bottiglia in termini di archiviazione e prestazioni.No storage and performance bottlenecks. È importante scegliere una proprietà che consenta di distribuire le scritture su una serie di valori distinti.It's important to pick a property that allows writes to be distributed across various distinct values. Le richieste per la stessa chiave di partizione non possono superare la velocità effettiva di una partizione singola e vengono limitate.Requests to the same partition key can't exceed the throughput of a single partition and are throttled. È quindi importante scegliere una chiave di partizione che non generi "aree sensibili" all'interno dell'applicazione.So it's important to pick a partition key that doesn't result in "hot spots" within your application. Poiché tutti i dati per una singola chiave di partizione devono essere archiviati in una partizione, è consigliabile evitare le chiavi di partizione con volumi elevati di dati per lo stesso valore.Because all the data for a single partition key must be stored within a partition, you should avoid partition keys that have high volumes of data for the same value.

Verranno ora esaminati alcuni scenari reali con le chiavi di partizione corrette per ognuno:Let's look at a few real-world scenarios and good partition keys for each:

  • Se si implementa un back-end del profilo utente, l'ID utente rappresenta la scelta ideale per la chiave di partizione.If you're implementing a user profile back end, the user ID is a good choice for partition key.
  • Se si archiviano dati IoT, ad esempio lo stato del dispositivo, l'ID dispositivo rappresenta la scelta ideale per la chiave di partizione.If you're storing IoT data, for example, device state, a device ID is a good choice for partition key.
  • Se si usa Azure Cosmos DB per la registrazione di dati di serie temporali, il nome host o l'ID processo rappresenta la scelta ottimale per la chiave di partizione.If you're using Azure Cosmos DB for logging time-series data, the hostname or process ID is a good choice for partition key.
  • Se si dispone di un'architettura multi-tenant, l'ID tenant rappresenta la scelta ideale per la chiave di partizione.If you have a multitenant architecture, the tenant ID is a good choice for partition key.

In alcuni casi d'uso, come l'IoT e i profili utente, la chiave di partizione può corrispondere all'ID (chiave del documento).In some use cases, like IoT and user profiles, the partition key might be the same as your ID (document key). In altri casi, come ad esempio i dati di serie temporali, la chiave di partizione potrebbe essere diversa rispetto all'ID.In others, like the time-series data, you might have a partition key that's different from the ID.

Partizionamento e registrazione di dati di serie temporaliPartitioning and logging/time-series data

Uno dei casi d'uso più comuni di Azure Cosmos DB è rappresentato da registrazione e telemetria.One of the common use cases of Azure Cosmos DB is for logging and telemetry. È importante scegliere una chiave di partizione efficace perché potrebbe essere necessario scrivere/leggere grandi volumi di dati.It's important to pick a good partition key, because you might need to read/write vast volumes of data. La scelta dipende dalla frequenza di lettura e scrittura e dai tipi di query che si prevede di eseguire.The choice depends on your read-and-write rates and the kinds of queries you expect to run. Di seguito sono riportati alcuni suggerimenti su come scegliere una chiave di partizione efficace:Here are some tips on how to choose a good partition key:

  • Se il caso d'uso prevede frequenze di scrittura ridotte che si accumulano nel tempo ed è necessario eseguire una query per intervalli di timestamp e altri filtri, usare un'implementazione del timestamp.If your use case involves a small rate of writes that accumulate over a long time and you need to query by ranges of time stamps and other filters, use a rollup of the time stamp. Ad esempio, un approccio valido consiste nell'usare la data come chiave di partizione.For example, a good approach is to use date as a partition key. Con questo approccio è possibile eseguire query su tutti i dati per una data da una singola partizione.With this approach, you can query over all the data for a date from a single partition.
  • Se il carico di lavoro prevede molte scritture, scenario più comune, usare una chiave di partizione non basata su timestamp.If your workload is written heavy, which is more common, use a partition key that's not based on time stamp. Con questo approccio Azure Cosmos DB può distribuire in modo uniforme le scritture in più partizioni.With this approach, Azure Cosmos DB can distribute writes evenly across various partitions. In questo caso, un nome host, un ID processo, un ID attività o un'altra proprietà con una cardinalità elevata è una scelta efficace.Here a hostname, process ID, activity ID, or another property with high cardinality is a good choice.
  • Un altro approccio è quello ibrido, in cui si hanno più contenitori, uno per ogni giorno/mese, e la chiave di partizione è una proprietà granulare, ad esempio un nome host.Another approach is a hybrid one where you have multiple containers, one for each day/month, and the partition key is a granular property like hostname. Questo approccio offre il vantaggio di impostare una velocità effettiva diversa in base all'intervallo di tempo.This approach has the benefit that you can set different throughput based on the time window. Ad esempio, il contenitore per il mese in corso viene sottoposto a provisioning con una velocità effettiva superiore, poiché gestisce letture e scritture.For example, the container for the current month is provisioned with higher throughput because it serves reads and writes. I mesi precedenti vengono sottoposti a provisioning con velocità effettiva inferiore poiché gestisce solo letture.Previous months are provisioned with lower throughput because they only serve reads.

Partizionamento e multi-tenancyPartitioning and multitenancy

Se si implementa un'applicazione multi-tenant usando Azure Cosmos DB, sono disponibili due criteri comuni: una chiave di partizione per ogni tenant e un contenitore per ogni tenant.If you're implementing a multitenant application by using Azure Cosmos DB, there are two popular patterns: one partition key per tenant and one container per tenant. Di seguito sono riportati vantaggi e svantaggi di ogni modello:Here are the pros and cons for each:

  • Una chiave di partizione per ogni tenant.One partition key per tenant. In questo modello i tenant vengono collocati all'interno di un singolo contenitore.In this model, tenants are collocated within a single container. Le query e gli inserimenti di elementi all'interno di un tenant possono essere tuttavia eseguiti a fronte di una partizione singola.But queries and inserts for items within a single tenant can be performed against a single partition. È anche possibile implementare la logica transazionale su tutti gli elementi all'interno di un tenant.You can also implement transactional logic across all items within a tenant. Poiché più tenant condividono un contenitore, è possibile risparmiare i costi di archiviazione e velocità effettiva raggruppando le risorse per i tenant all'interno di un singolo contenitore invece di eseguire il provisioning di capacità aggiuntiva per ogni tenant.Because multiple tenants share a container, you can save storage and throughput costs by pooling resources for tenants within a single container rather than provisioning extra headroom for each tenant. Lo svantaggio è che non si ottiene l'isolamento delle prestazioni per ogni tenant.The drawback is that you don't have performance isolation per tenant. Gli aumenti di prestazioni/velocità effettiva si applicano all'intero contenitore rispetto agli aumenti previsti per i tenant.Performance/throughput increases apply to the entire container versus targeted increases for tenants.
  • Un contenitore per ogni tenant.One container per tenant. In questo modello ogni tenant dispone di un proprio contenitore ed è possibile riservare prestazioni per ogni tenant.In this model, each tenant has its own container, and you can reserve performance per tenant. Con il nuovo tariffario per il provisioning di Azure Cosmos DB, questo modello è più conveniente per applicazioni multi-tenant con un numero ridotto di tenant.With the Azure Cosmos DB new provisioning pricing, this model is more cost-effective for multitenant applications with a few tenants.

È anche possibile usare un approccio combinato/a livelli che colloca tenant di dimensioni ridotte ed esegue la migrazione di tenant di dimensioni maggiori al relativo contenitore.You can also use a combination/tiered approach that collocates small tenants and migrates larger tenants to their own container.

Passaggi successiviNext steps

In questo articolo è stata illustrata una panoramica di concetti e procedure consigliate per il partizionamento con qualsiasi API di Azure Cosmos DB.In this article, we provided an overview of concepts and best practices for partitioning with any Azure Cosmos DB API.