Управление уровнями согласованности в Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

В этой статье рассматривается управление уровнями согласованности в Azure Cosmos DB. Вы узнаете, как настроить уровень согласованности по умолчанию, а также как переопределить ее и управлять маркерами сеанса вручную. Кроме того, здесь приведены общие сведения о метрике вероятностного ограниченного устаревания (PBS).

При изменении согласованности на уровне учетной записи необходимо повторно развернуть приложения и внести необходимые изменения кода для применения этих изменений.

Примечание.

Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Чтобы начать работу, см. статью Установка Azure PowerShell. Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.

Настройка уровня согласованности по умолчанию

Клиенты по умолчанию используют стандартный уровень согласованности.

Чтобы просмотреть или изменить уровень согласованности по умолчанию, войдите на портал Azure. Найдите учетную запись Azure Cosmos DB и откройте панель Согласованность по умолчанию. Выберите требуемый уровень согласованности в качестве нового значения по умолчанию, а затем выберите Сохранить. На портале Azure также представлена визуализация разных уровней согласованности на основе музыкальных нот.

Меню согласованности на портале Azure

Переопределение уровня согласованности по умолчанию

Клиенты могут переопределить уровень согласованности по умолчанию, который задается службой. Уровень согласованности можно задать на основе каждого запроса, который переопределяет уровень согласованности по умолчанию на уровне учетной записи.

Совет

Согласованность может ослаблена только на уровне экземпляра пакета SDK или запроса. Чтобы перейти от более слабой к более сильной согласованности, обновите согласованность по умолчанию для учетной записи Azure Cosmos DB.

Совет

Переопределение уровня согласованности по умолчанию применяется только к операциям чтения в клиенте SDK. Учетная запись, настроенная на строгую согласованность по умолчанию, по-прежнему будет записывать и реплицировать данные синхронно в каждый регион в учетной записи. Когда экземпляр клиента SDK или запрос переопределяет этот параметр на значение согласованности сеанса или менее строгую согласованность, операции чтения будут выполняться с использованием одной реплики. Дополнительные сведения см. в разделе Уровни согласованности и пропускная способность.

Пакет 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);

Пакет SDK для Java версии 4

Асинхронный API пакета SDK для Java версии 4 (Maven com.azure::azure-cosmos)


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

Пакеты средств разработки для Java версии 2

Асинхронный пакет средств разработки для Java версии 2 (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();

Пакет SDK для Node.js, JavaScript и TypeScript

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

Пакет SDK для 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)

Использование маркеров сеанса

Один из этих уровней согласованности в Azure Cosmos DB — согласованность сеансов. Это уровень по умолчанию, применяемый к учетным записям Azure Cosmos DB по умолчанию. При работе с моделью согласованности сеансов каждому новому запросу на запись к Azure Cosmos DB присваивается новый маркер SessionToken. CosmosClient будет использовать этот маркер для внутренних целей с каждой операцией записи и запросом для поддержания заданного уровня согласованности.

В некоторых сценариях необходимо самостоятельно управлять этим сеансом. В веб-приложении с несколькими узлами у каждого узла будет свой экземпляр CosmosClient. Если вы хотите, чтобы эти узлы участвовали в одном сеансе (чтобы иметь возможность читать собственные записи последовательно на веб-уровнях), вам придется отправить SessionToken из FeedResponse<T> действия записи пользователю с помощью файла cookie или другого механизма, и иметь этот поток маркера обратно в веб-уровень и в конечном итоге CosmosClient для последующих операций чтения. Если вы используете подсистему балансировки нагрузки с циклическим перебором, которая не поддерживает сходство сеансов между запросами, например Azure Load Balancer, чтение может потенциально приземлиться на другом узле с запросом на запись, где был создан сеанс.

Если вы не выполняете поток сеанса Azure Cosmos DB, как описано выше, вы можете в конечном итоге получить несогласованные результаты чтения в течение некоторого времени.

Маркеры сеансов в Azure Cosmos DB привязаны к секциям, то есть они связаны исключительно с одной секцией. Чтобы обеспечить чтение записей, используйте маркер сеанса, который был создан для соответствующих элементов. Чтобы управлять токенами сеанса вручную, получите токен сеанса из ответа и установите их для каждого запроса. Если у вас нет необходимости управлять токенами сеанса вручную, то вам не нужно использовать эти примеры. Пакет SDK отслеживает токены сеанса автоматически. Если токен сеанса не задан вручную, по умолчанию в пакете SDK используется последний.

Пакет 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);

Пакет SDK для Java версии 4

Асинхронный API пакета SDK для Java версии 4 (Maven com.azure::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();

Пакеты средств разработки для Java версии 2

Асинхронный пакет средств разработки для Java версии 2 (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);

Пакет SDK для Node.js, JavaScript и TypeScript

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

Пакет SDK для 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)

Мониторинг метрики вероятностного ограниченного устаревания (PBS)

Насколько итоговая согласованность является итоговой? В среднем случае мы можем предложить устаревшие границы в отношении журнала версий и времени. Метрика Probabilistically Bounded Staleness (PBS) (Вероятностное ограниченное устаревание) пытается количественно оценить вероятность устаревания и отображает полученные результаты.

Чтобы просмотреть метрики PBS, перейдите к учетной записи Azure Cosmos DB на портале Azure. Откройте панель метрик (классическая модель) и перейдите на вкладку "Согласованность". Просмотрите граф с именем "Вероятность строго согласованных операций чтения" на основе рабочей нагрузки (см. раздел PBS).

График PBS на портале Azure

Следующие шаги

Узнайте больше о том, как управлять конфликтами данных, или перейдите к следующей ключевой концепции в Azure Cosmos DB. См. следующие статьи: