Zarządzanie poziomami spójności w usłudze Azure Cosmos DB

DOTYCZY: NoSQL

W tym artykule wyjaśniono, jak zarządzać poziomami spójności w usłudze Azure Cosmos DB. Dowiesz się, jak skonfigurować domyślny poziom spójności, zastąpić spójność domyślną, ręcznie zarządzać tokenami sesji oraz jak rozumieć metrykę PBS (Probabilistically Bounded Staleness).

Podczas zmiany spójności na poziomie konta upewnij się, że ponownie wdrażasz aplikacje i wprowadzasz wszelkie niezbędne modyfikacje kodu, aby zastosować te zmiany.

Uwaga

Do interakcji z platformą Azure zalecamy używanie modułu Azure Az w programie PowerShell. Zobacz Instalowanie programu Azure PowerShell, aby rozpocząć. Aby dowiedzieć się, jak przeprowadzić migrację do modułu Az PowerShell, zobacz Migracja programu Azure PowerShell z modułu AzureRM do modułu Az.

Konfigurowanie domyślnego poziomu spójności

Domyślny poziom spójności to poziom spójności używany domyślnie przez klientów.

Aby wyświetlić lub zmodyfikować domyślny poziom spójności, zaloguj się do witryny Azure Portal. Znajdź swoje konto usługi Azure Cosmos DB i otwórz okienko Domyślna spójność. Wybierz odpowiedni poziom spójności jako nowe ustawienie domyślne, a następnie wybierz pozycję Zapisz. Azure Portal zapewnia również wizualizację różnych poziomów spójności z nutami muzycznymi.

Menu spójności w witrynie Azure Portal

Zastępowanie domyślnego poziomu spójności

Klienci mogą zastąpić domyślny poziom spójności, który jest ustawiony przez usługę. Poziom spójności można ustawić dla poszczególnych żądań, co zastępuje domyślny poziom spójności ustawiony na poziomie konta.

Porada

Spójność może być złagodzona tylko na poziomie wystąpienia zestawu SDK lub żądania. Aby przejść z słabszej do silniejszej spójności, zaktualizuj domyślną spójność dla konta usługi Azure Cosmos DB.

Porada

Zastępowanie domyślnego poziomu spójności dotyczy tylko operacji odczytu w kliencie zestawu SDK. Konto skonfigurowane domyślnie pod kątem silnej spójności będzie domyślnie zapisywać i replikować dane synchronicznie do każdego regionu na koncie. Gdy wystąpienie klienta zestawu SDK lub żądanie zastępuje to za pomocą sesji lub słabszej spójności, operacje odczytu będą wykonywane przy użyciu pojedynczej repliki. Aby uzyskać więcej informacji, zobacz Poziomy spójności i przepływność .

Zestaw SDK .NET

// 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);

Zestaw SDK języka Java w wersji 4

Zestaw Java SDK w wersji 4 (Maven com.azure::azure-cosmos) Asynchroniczny interfejs API


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

Zestawy SDK języka Java w wersji 2

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 });

Zestaw SDK dla języka Python

# 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)

Korzystanie z tokenów sesji

Jednym z poziomów spójności w usłudze Azure Cosmos DB jest spójność sesji . Jest to domyślny poziom stosowany do kont usługi Azure Cosmos DB domyślnie. Podczas pracy z spójnością sesji każde nowe żądanie zapisu w usłudze Azure Cosmos DB jest przypisywane do nowego tokenu SessionToken. Klient CosmosClient będzie używać tego tokenu wewnętrznie z każdym żądaniem odczytu/zapytania, aby upewnić się, że poziom spójności zestawu jest utrzymywany.

W niektórych scenariuszach musisz samodzielnie zarządzać tą sesją. Rozważmy aplikację internetową z wieloma węzłami. Każdy węzeł będzie miał własne wystąpienie obiektu CosmosClient. Jeśli chcesz, aby te węzły brały udział w tej samej sesji (aby móc odczytywać własne zapisy spójnie w różnych warstwach internetowych), musisz wysłać token SessionToken z elementu FeedResponse<T> akcji zapisu do użytkownika końcowego przy użyciu pliku cookie lub innego mechanizmu i mieć ten token przepływ z powrotem do warstwy internetowej, a ostatecznie do usługi CosmosClient na potrzeby kolejnych operacji odczytu. Jeśli używasz modułu równoważenia obciążenia z działaniem okrężnym, który nie utrzymuje koligacji sesji między żądaniami, takimi jak Azure Load Balancer, odczyt może potencjalnie wylądować w innym węźle do żądania zapisu, gdzie sesja została utworzona.

Jeśli nie przepływasz tokenu SessionToken usługi Azure Cosmos DB zgodnie z powyższym opisem, możesz przez pewien czas napotkać niespójne wyniki odczytu.

Tokeny sesji w usłudze Azure Cosmos DB są powiązane z partycjami, co oznacza, że są one skojarzone wyłącznie z jedną partycją. Aby mieć pewność, że możesz odczytać zapisy, użyj tokenu sesji, który został ostatnio wygenerowany dla odpowiednich elementów. Aby ręcznie zarządzać tokenami sesji, pobieraj token sesji z odpowiedzi i ustawiaj go dla poszczególnych żądań. Jeśli nie chcesz ręcznie zarządzać tokenami sesji, nie musisz korzystać z tych przykładów. Zestaw SDK automatycznie śledzi tokeny sesji. Jeśli nie ustawisz tokenu sesji ręcznie, zestaw SDK domyślnie użyje najnowszego tokenu sesji.

Zestaw SDK .NET

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);

Zestaw SDK języka Java w wersji 4

Zestaw Java SDK w wersji 4 (Maven com.azure::azure-cosmos) Asynchroniczny interfejs API


// 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();

Zestawy SDK języka Java w wersji 2

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 });

Zestaw SDK dla języka Python

// 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)

Monitorowanie metryki PBS (Probabilistically Bounded Staleness)

Jak ostateczna jest spójność ostateczna? W przypadku średniego przypadku możemy zaoferować ograniczenia nieaktualności w odniesieniu do historii i czasu wersji. Metryka Probabilistically Bounded Staleness (PBS) próbuje oszacować prawdopodobieństwo nieaktualności i pokazuje ją jako metrykę.

Aby wyświetlić metrykę PBS, przejdź do swojego konta usługi Azure Cosmos DB w witrynie Azure Portal. Otwórz okienko Metryki (klasyczne) i wybierz kartę Spójność . Przyjrzyj się grafowi o nazwie Prawdopodobieństwo silnie spójnych operacji odczytu na podstawie obciążenia (zobacz PBS).

Wykres PBS w witrynie Azure Portal

Następne kroki

Dowiedz się więcej o zarządzaniu konfliktami danych lub przejdź do następnej kluczowej koncepcji w usłudze Azure Cosmos DB. Zobacz następujące artykuły: