Zarządzanie poziomami spójności w usłudze Azure Cosmos DB
Artykuł
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.
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. Witryna Azure Portal udostępnia również wizualizację różnych poziomów spójności z nutami muzycznymi.
Utwórz konto usługi Azure Cosmos DB ze spójnością sesji, a następnie zaktualizuj domyślną spójność.
# Create a new account with Session consistency
az cosmosdb create --name $accountName --resource-group $resourceGroupName --default-consistency-level Session
# update an existing account's default consistency
az cosmosdb update --name $accountName --resource-group $resourceGroupName --default-consistency-level Strong
Utwórz konto usługi Azure Cosmos DB ze spójnością sesji, a następnie zaktualizuj domyślną spójność.
# Create a new account with Session consistency
New-AzCosmosDBAccount -ResourceGroupName $resourceGroupName `
-Location $locations -Name $accountName -DefaultConsistencyLevel "Session"
# Update an existing account's default consistency
Update-AzCosmosDBAccount -ResourceGroupName $resourceGroupName `
-Name $accountName -DefaultConsistencyLevel "Strong"
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ń, który zastępuje domyślny poziom spójności ustawiony na poziomie konta.
Napiwek
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.
Napiwek
Zastąpienie domyślnego poziomu spójności dotyczy tylko operacji odczytu w kliencie zestawu SDK. Konto skonfigurowane pod kątem silnej spójności domyślnie będzie nadal zapisywać i replikować dane synchronicznie do każdego regionu na koncie. Gdy wystąpienie klienta zestawu SDK lub żądanie zastąpi to za pomocą sesji lub słabszej spójności, operacje odczytu będą wykonywane przy użyciu pojedynczej repliki. Aby uzyskać więcej szczegółów, zobacz Poziomy spójności i przepływność .
// Override consistency at the client level
ConnectionPolicy connectionPolicy = new ConnectionPolicy();
DocumentClient client = new DocumentClient(accountEndpoint, accountKey, connectionPolicy, ConsistencyLevel.Eventual);
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 ze spójnością sesji każde nowe żądanie zapisu w usłudze Azure Cosmos DB ma przypisaną nową wartość SessionToken. Klient CosmosClient będzie używać tego tokenu wewnętrznie z każdym żądaniem odczytu/zapytania, aby upewnić się, że ustawiony poziom spójności 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 sieci Web), 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ć przepływ tokenu z powrotem do warstwy internetowej i ostatecznie 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 usługa Azure Load Balancer, odczyt może potencjalnie wylądować w innym węźle do żądania zapisu, w którym została utworzona sesja.
Jeśli nie przepływasz tokenu SessionToken usługi Azure Cosmos DB zgodnie z powyższym opisem, możesz od jakiegoś czasu uzyskać niespójne wyniki odczytu.
Tokeny sesji w usłudze Azure Cosmos DB są powiązane z partycjami, co oznacza, że są one wyłącznie skojarzone 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 JAVA SDK w wersji 4 (Maven com.azure::azure-cosmos) Async 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();
Zestaw Java SDK w wersji 4 (Maven com.azure::azure-cosmos) Interfejs API synchronizacji
// Get session token from response
CosmosItemResponse<JsonNode> response = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class);
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);
// 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);
// Get session token from response
ResourceResponse<Document> response = client.readDocument(documentLink, null);
String sessionToken = response.getSessionToken();
// Resume the session by setting the session token on the RequestOptions
RequestOptions options = new RequestOptions();
options.setSessionToken(sessionToken);
ResourceResponse<Document> response = client.readDocument(documentLink, 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)
Jak ostateczna jest spójność ostateczna? W przypadku średniego przypadku możemy zaoferować nieaktualność granic 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 odczytów na podstawie obciążenia (zobacz PBS).
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. Odwiedź następujące artykuły:
Pisanie wydajnych zapytań, tworzenie zasad indeksowania, zarządzanie zasobami i aprowizowanie ich w interfejsie API SQL i zestawie SDK za pomocą usługi Microsoft Azure Cosmos DB.