Cosmosdb (429) Слишком много запросов - горячие разделы с иерархическим подходом к ключеC#

Место общения программистов C#
Ответить
Anonymous
 Cosmosdb (429) Слишком много запросов - горячие разделы с иерархическим подходом к ключе

Сообщение Anonymous »

фон того, что делает рабочий процесс:
Ниже приведен некоторый фон вокруг того, как в настоящее время выглядит наш рабочий процесс, на случай, если это имеет какое -либо отношение к Проблема, поскольку у меня есть подозрение, это может! 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
< /li>
[*] cosmosclient (.net sdk v3):
  • allowbulkexecution: true < /code> < /li>
    ConnectionMode: Gateway < /code> < /li>
    < /ul>
    < /li>
    Структура базы данных:

    Персонал (контейнер)
  • Студенты (контейнер)
  • Guardians (контейнер)
Пример того, как мы используем .net cosmos sdk для выполнения наших объемных творений: [/b]
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»