Správa úrovní konzistence ve službě Azure Cosmos DB

PLATÍ PRO: NoSQL

Tento článek vysvětluje, jak spravovat úrovně konzistence ve službě Azure Cosmos DB. Dozvíte se, jak nakonfigurovat výchozí úroveň konzistence, přepsat výchozí konzistenci, ručně spravovat tokeny relace a porozumět metrikě Probabilisticky omezená neautnost (PBS).

Při změně konzistence na úrovni účtu se ujistěte, že aplikace nasadíte znovu a provedete potřebné úpravy kódu, aby se tyto změny použily.

Poznámka:

Při práci s Azure doporučujeme používat modul Azure Az PowerShellu. Začněte tím, že si projdete téma Instalace Azure PowerShellu. Informace o tom, jak migrovat na modul Az PowerShell, najdete v tématu Migrace Azure PowerShellu z AzureRM na Az.

Konfigurace výchozí úrovně konzistence

Výchozí úroveň konzistence je úroveň konzistence, kterou ve výchozím nastavení používají klienti.

Pokud chcete zobrazit nebo upravit výchozí úroveň konzistence, přihlaste se k webu Azure Portal. Vyhledejte svůj účet služby Azure Cosmos DB a otevřete podokno Výchozí konzistence . Vyberte požadovanou úroveň konzistence jako nové výchozí nastavení a pak vyberte Uložit. Azure Portal také poskytuje vizualizaci různých úrovní konzistence s hudebními poznámkami.

Nabídka Konzistence na webu Azure Portal

Přepsání výchozí úrovně konzistence

Klienti můžou přepsat výchozí úroveň konzistence nastavenou službou. Úroveň konzistence lze nastavit pro jednotlivé požadavky, která přepíše výchozí úroveň konzistence nastavenou na úrovni účtu.

Tip

Konzistence může být uvolněná pouze na úrovni instance sady SDK nebo požadavku. Pokud chcete přejít ze slabší na silnější konzistenci, aktualizujte výchozí konzistenci pro účet služby Azure Cosmos DB.

Tip

Přepsání výchozí úrovně konzistence platí jenom pro čtení v klientovi sady SDK. Účet nakonfigurovaný pro silnou konzistenci ve výchozím nastavení bude stále zapisovat a replikovat data synchronně do každé oblasti v účtu. Když instance klienta sady SDK nebo požadavek přepíše tuto relaci nebo slabší konzistenci, čtení se provede pomocí jedné repliky. Další podrobnosti najdete na úrovních konzistence a propustnosti.

.NET SDK

// Override consistency at the client level
documentClient = new DocumentClient(new Uri(endpoint), authKey, connectionPolicy, ConsistencyLevel.Eventual);

// Override consistency at the request level via request options
RequestOptions requestOptions = new RequestOptions { ConsistencyLevel = ConsistencyLevel.Eventual };

var response = await client.ReadDocumentAsync(collectionUri, document, requestOptions);

Java V4 SDK

Rozhraní Async API sady Java SDK V4 (Maven com::azure-cosmos)


CosmosAsyncClient client =
        new CosmosClientBuilder()
                .endpoint(HOST)
                .key(MASTER_KEY)
                .consistencyLevel(ConsistencyLevel.EVENTUAL)
                .buildAsyncClient();

Sady Java V2 SDK

Async Java V2 SDK (Maven com.microsoft.azure::azure-cosmosdb)

// Override consistency at the client level
ConnectionPolicy policy = new ConnectionPolicy();

AsyncDocumentClient client =
        new AsyncDocumentClient.Builder()
                .withMasterKey(this.accountKey)
                .withServiceEndpoint(this.accountEndpoint)
                .withConsistencyLevel(ConsistencyLevel.Eventual)
                .withConnectionPolicy(policy).build();

Node.js/JavaScript/TypeScript SDK

// Override consistency at the client level
const client = new CosmosClient({
  /* other config... */
  consistencyLevel: ConsistencyLevel.Eventual
});

// Override consistency at the request level via request options
const { body } = await item.read({ consistencyLevel: ConsistencyLevel.Eventual });

Python SDK

# Override consistency at the client level
connection_policy = documents.ConnectionPolicy()
client = cosmos_client.CosmosClient(self.account_endpoint, {
                                    'masterKey': self.account_key}, connection_policy, documents.ConsistencyLevel.Eventual)

Využití tokenů relace

Jednou z úrovní konzistence ve službě Azure Cosmos DB je konzistence relací . Toto je výchozí úroveň použitá pro účty služby Azure Cosmos DB ve výchozím nastavení. Při práci s konzistencí relace se každému novému požadavku na zápis do služby Azure Cosmos DB přiřadí nový objekt SessionToken. CosmosClient použije tento token interně s každou žádostí o čtení a dotaz, aby se zajistilo, že je zachována nastavená úroveň konzistence.

V některých scénářích musíte tuto relaci spravovat sami. Představte si webovou aplikaci s více uzly, každý uzel bude mít svou vlastní instanci CosmosClient. Pokud byste chtěli, aby se tyto uzly účastnily stejné relace (aby mohly číst vlastní zápisy konzistentně napříč webovými vrstvami), museli byste odeslat SessionToken z FeedResponse<T> akce zápisu koncovému uživateli pomocí souboru cookie nebo jiného mechanismu a tento tok tokenu zpět do webové vrstvy a nakonec CosmosClient pro následné čtení. Pokud používáte nástroj pro vyrovnávání zatížení s kruhovým dotazem, který neudržuje spřažení relací mezi požadavky, jako je Azure Load Balancer, může čtení potenciálně přistát na jiném uzlu k žádosti o zápis, kde byla relace vytvořena.

Pokud neprotékáte objekt SessionToken služby Azure Cosmos DB, jak je popsáno výše, můžete na chvíli končit nekonzistentními výsledky čtení.

Tokeny relací ve službě Azure Cosmos DB jsou vázané na oddíly, což znamená, že jsou výhradně přidružené k jednomu oddílu. Abyste měli jistotu, že budete moct číst zápisy, použijte token relace, který se naposledy vygeneroval pro příslušné položky. Pokud chcete tokeny relace spravovat ručně, získejte token relace z odpovědi a nastavte je pro každý požadavek. Pokud nepotřebujete spravovat tokeny relací ručně, nemusíte tyto ukázky používat. Sada SDK sleduje tokeny relací automaticky. Pokud token relace nenastavíte ručně, sada SDK použije nejnovější token relace.

.NET SDK

var response = await client.ReadDocumentAsync(
                UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"));
string sessionToken = response.SessionToken;

RequestOptions options = new RequestOptions();
options.SessionToken = sessionToken;
var response = await client.ReadDocumentAsync(
                UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"), options);

Java V4 SDK

Rozhraní Async API sady Java SDK V4 (Maven com::azure-cosmos)


// Get session token from response
CosmosItemResponse<JsonNode> response = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();
String sessionToken = response.getSessionToken();

// Resume the session by setting the session token on the RequestOptions
CosmosItemRequestOptions options = new CosmosItemRequestOptions();
options.setSessionToken(sessionToken);
CosmosItemResponse<JsonNode> response2 = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();

Sady Java V2 SDK

Async Java V2 SDK (Maven com.microsoft.azure::azure-cosmosdb)

// Get session token from response
RequestOptions options = new RequestOptions();
options.setPartitionKey(new PartitionKey(document.get("mypk")));
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);
readObservable.single()           // we know there will be one response
  .subscribe(
      documentResourceResponse -> {
          System.out.println(documentResourceResponse.getSessionToken());
      },
      error -> {
          System.err.println("an error happened: " + error.getMessage());
      });

// Resume the session by setting the session token on RequestOptions
RequestOptions options = new RequestOptions();
requestOptions.setSessionToken(sessionToken);
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);

Node.js/JavaScript/TypeScript SDK

// Get session token from response
const { headers, item } = await container.items.create({ id: "meaningful-id" });
const sessionToken = headers["x-ms-session-token"];

// Immediately or later, you can use that sessionToken from the header to resume that session.
const { body } = await item.read({ sessionToken });

Python SDK

// Get the session token from the last response headers
item = client.ReadItem(item_link)
session_token = client.last_response_headers["x-ms-session-token"]

// Resume the session by setting the session token on the options for the request
options = {
    "sessionToken": session_token
}
item = client.ReadItem(doc_link, options)

Monitorování metriky Pravděpodobnostně omezená neaktuálnost (PBS)

Jak je konečná konzistence? V průměrném případě můžeme nabídnout neautnost vzhledem k historii verzí a času. Metrika Probabilisticky ohraničená neakutnost (PBS) se snaží kvantifikovat pravděpodobnost neautnosti a ukazuje ji jako metriku.

Pokud chcete zobrazit metriku PBS, přejděte na webu Azure Portal ke svému účtu služby Azure Cosmos DB. Otevřete podokno Metriky (Classic) a vyberte kartu Konzistence. Podívejte se na graf s názvem Pravděpodobnost silně konzistentních čtení na základě vaší úlohy (viz PBS).

Graf PBS na webu Azure Portal

Další kroky

Přečtěte si další informace o správě konfliktů dat nebo přejděte k dalšímu klíčovému konceptu ve službě Azure Cosmos DB. Podívejte se na následující články: