Ниже приведен некоторый фон вокруг того, как в настоящее время выглядит наш рабочий процесс, на случай, если это имеет какое -либо отношение к Проблема, поскольку у меня есть подозрение, это может! li>
[*] У нас есть запланированная служба, которая работает ежедневно и итерация через каждого клиента и делает следующее:
- Избирает все данные, которые есть у клиента о себе Из внешней службы (входящие данные клиента)
- Извлекает все данные, которые мы имеем в настоящее время в нашей базе данных COSMOS для этого клиента, то есть из предыдущих запланированных прогонов (strong> текущие данные клиента)
- выполняет группу предварительной обработки по данным
- Выполняет различие между входящими данными и текущими данными для Установите, какие записи нам необходимо создать/обновить/удалить
- выполнить объемные операции Create/Update/Delete (встреча с 429 выпуском здесь)
Примечание: клиенты могут иметь от 1000 до 500 000 записей в своих данных наборы. Хотя они большие, я бы не ожидал, что эти виды чисел будут слишком большими при разговоре о объемных операциях.
Пример записи: < Br />{
"id": "9332a5ad-0de1-406b-9422-1448cb95b350",
"clientId": "b1d07561-8c38-4423-8ab1-f458d5a67920",
"personDetails": {
"firstName": "Joe",
"middleName": null,
"lastName": "Bloggs",
"dateOfBirth": null
},
// Addtional properties here - left out for brevity
"isDeleted": false,
"ttl": -1
}
Проблема:
В настоящее время мы сталкиваемся с скоростью дроссельной заслонки (в результате 429 слишком много запросов) 30% при выполнении объемных операций в рабочем процессе, описанном выше. Похоже, что наши операции записи, которые вызывают проблемы. Распределение объемных операций было бы с максимальной эффективностью, потому что сейчас будет логическое разделение на запись. Запросить понимание. обрабатывать данные таким образом ...
Ищу некоторые мысли по этому поводу.
вещи, которые мы сделали до сих пор: < /p>
- Выбор ключа раздела уже прошел несколько итераций, и ни один из вариантов не облегчил проблему (см. Ниже итерации)
Первая итерация: [clientId] - Вторая итерация: синтетический ключ, изготовленный из [шестнадцатеричный характер] _ [clientId]
- Текущая итерация: иерархическая ключ раздела [clientId] _ [id]
[*] Мы прекрасно настроили наши индексы, чтобы избежать поведения по умолчанию индексации всех свойств < /li>
Играя с настройками пропускной способности (см. Ниже наши текущие настройки) < /li >
< /ul>
текущая настройка: < /strong> < /p>
- Пропускная способность базы данных:
AutoScale: On - max rus: 45000
[*] cosmosclient (.net sdk v3):
- allowbulkexecution: true < /code> < /li>
ConnectionMode: Gateway < /code> < /li>
< /ul>
< /li>
Структура базы данных:
Персонал (контейнер) - Студенты (контейнер)
- Guardians (контейнер)
var staffMembers = new List(); // For brevity - this would contain potentially 500k records
var createTasks = staffMembers.Select(staffMember =>
{
var partitionKey = new PartitionKeyBuilder()
.Add(staffMember.ClientId.ToString())
.Add(staffMember.Id.ToString())
.Build();
return _container.CreateItemAsync(staffMember, partitionKey, new ItemRequestOptions()
{
EnableContentResponseOnWrite = false
})
.ContinueWith(itemResponse =>
{
// Bunch of error handling here.. removed for brevity
});
})
.ToList();
await Task.WhenAll(createTasks);
Пример того, как мы используем .NET Cosmos SDK для выполнения наших объемных обновлений:
var staffMembers = new List(); // For brevity - this would contain potentially 500k records
var updateTasks = staffMembers.Select(staffMember =>
{
var partitionKey = new PartitionKeyBuilder()
.Add(staffMember.ClientId.ToString())
.Add(staffMember.Id.ToString())
.Build();
return _container.ReplaceItemAsync(staffMember, staffMember.Id.ToString(), partitionKey, new ItemRequestOptions()
{
EnableContentResponseOnWrite = false
})
.ContinueWith(itemResponse =>
{
// Bunch of error handling here.. removed for brevity
});
})
.ToList();
await Task.WhenAll(updateTasks);
Подробнее здесь: https://stackoverflow.com/questions/794 ... rtition-ke
Мобильная версия