Создание искусственного ключа секции

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

Мы рекомендуем использовать ключи секций при наличии множества (сотен или тысяч) различных значений. Главное — это равномерное распределение данных и рабочей нагрузки по всем элементам, связанным с этими значениями ключа секции. Если в ваших данных нет такого свойства, вы можете создать искусственный ключ секции. В этом документе описывается несколько основных методов создания искусственного ключа секции для контейнера Azure Cosmos DB.

Сцепление нескольких свойств элемента

Вы можете создать ключ секции, объединив несколько значений свойств в одно искусственное свойство partitionKey. Эти ключи называются искусственными ключами. Рассмотрим следующий пример документа:

{
"deviceId": "abc-123",
"date": 2018
}

Для предыдущего документа одним из вариантов является установка /deviceId или /date в качестве ключа секции. Используйте его, если вы хотите разбить свой контейнер на основе идентификатора устройства или даты. Другой вариант заключается в сцеплении этих двух значений в искусственное свойство partitionKey, которое используется в качестве ключа секции.

{
"deviceId": "abc-123",
"date": 2018,
"partitionKey": "abc-123-2018"
}

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

Использование ключа секции со случайным суффиксом

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

Например, если ключ секции представляет собой дату, вы можете выбрать случайное число в диапазоне от 1 до 400 и добавить его к дате в качестве суффикса. Вследствие этого метода создаются такие значения ключей секции, как 2018-08-09.1, 2018-08-09.2 и так далее до 2018-08-09.400 включительно. Так как вы рандомизируете ключ секции, ежедневные операции записи в контейнере распределяются равномерно по нескольким секциям. Этот метод обеспечивает оптимальный параллелизм и высокую общую пропускную способность.

Использование ключа секции с предварительно вычисленными суффиксами

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

Рассмотрим предыдущий пример, где контейнер использует дату в ключе секции. Предположим, что у каждого элемента есть атрибут Vehicle-Identification-Number (VIN), к которому нужно получить доступ. Также предположим, что вы часто выполняете запросы на поиск элементов по номеру VIN (в дополнение к дате). Прежде чем приложение запишет элемент в контейнер, оно может вычислить суффикс хэша на основе номера ТС и добавить его к дате ключа секции. При вычислении может быть сгенерировано число от 1 до 400 с равномерным распределением. Эти результаты аналогичны результатам, полученным методом рандомизации суффикса. Значением ключа секции будет дата, сцепленная с вычисленным результатом.

С помощью этой стратегии записи равномерно распределяются по значениям ключа секции и по секциям. Вы можете легко считать определенный элемент и дату, потому что способны вычислить значение ключа секции для определенного значения Vehicle-Identification-Number. Преимущество этого метода заключается в том, что можно избежать создания одного горячего ключа секции (ключа секции, который принимает всю рабочую нагрузку).

Дальнейшие действия

Подробнее о концепции разделения вы можете узнать в следующих статьях: