#c# #azure-cosmosdb
#c# #azure-cosmosdb
Вопрос:
В CosmosClient
(Cosmos DB .NET SDK v3) в AllowBulkExecution
свойстве есть флаг CosmosClientOptions
для включения / отключения массового выполнения. Безопасно ли изменять этот флаг в середине потенциально множества параллельно выполняемых операций (конечно, при условии, что я изменяю параметры потокобезопасным способом)? Или необходимо заменить CosmosClient
экземпляр другим экземпляром с другой настройкой?
Справочная информация: я хотел бы оптимизировать производительность, включив / отключив массовое выполнение в зависимости от скорости входящих запросов на изменение CosmosClient
.
Комментарии:
1. Что вы подразумеваете под оптимизацией производительности?
2. Максимизация пропускной способности (= включить массовое выполнение), если скорость входящих запросов высока, минимизация задержки (= отключить массовое выполнение), если скорость запросов низкая, на основе некоторых эвристик.
Ответ №1:
После сборки клиента изменение этого флага не имеет никакого эффекта. Если вы удерживаете CosmosClientOptions
экземпляр, последующее переключение флага не повлияет на уже созданный клиент.
Часть создания клиента клонирует экземпляр, который вы передали в качестве параметра: https://github.com/Azure/azure-cosmos-dotnet-v3/blob/40ceaffa848ebb6e3f4efa255df49f38290ef539/Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs#L61
В настоящее время (хотя и не уверен, будет ли это называться ожидаемым поведением) вы можете изменить флаг через cosmosClient.CosmosClientOptions
свойство в существующем экземпляре клиента.
Если вы хотели бы иметь возможность отключать или включать массовое выполнение на уровне каждой операции, пожалуйста, поделитесь своими отзывами здесь: https://github.com/Azure/azure-cosmos-dotnet-v3/issues/1496
РЕДАКТИРОВАТЬ: добавление разъяснений на основе комментариев.
Комментарии:
1. Но я имею в виду не сохранение экземпляра, а доступ к
CosmosClientOptions
свойству изCosmosClient
экземпляра. НастройкаAllowBulkExecution
этого свойства должна иметь немедленный эффект.2. В этом случае вы можете поддерживать два
CosmosClient
экземпляра (один с включенным пакетом, а другой обычный) и переключаться между ними в зависимости от нагрузки. В любом случае вам нужно написать небольшой отдельный путь к коду для bulk (Task.WhenAll
) . Подробнее devblogs.microsoft.com/cosmosdb /…3. @KrishnenduGhosh-MSFT Я не думаю, что вам обязательно нужно звонить
Task.WhenAll
, чтобы извлечь выгоду из массового выполнения. Конечно, CosmosClient не может определить, ожидались ли задачи внутри aTask.WhenAll
или они ожидались отдельно? Если я правильно понимаю, CosmosClient сгруппирует все запросы, которые появляются в течение определенного временного окна, и отправит их, либо потому, что пакет заполнен, либо по истечении временного окна. Кто-нибудь может подтвердить?4. Это правильно, задача. Когда все технически не требуется. У вас могут быть тысячи одновременных задач, выполняемых в разных частях вашего приложения, и делать то, что вы описали. Задача. Когда все это необходимо, хотя в случае, когда процесс, который вы выполняете, содержит всю информацию аккуратно вместе
5.
Task.WhenAll
это всего лишь один из способов параллелизма. Вы определенно можете сигнализировать об этом любым удобным для вас способом. Я хочу, чтобы вы отметили «… SDK будет создавать пакеты и группировать операции, когда пакет заполнится, он будет отправлен, но если пакет не заполнится, есть таймер, который отправит его, чтобы убедиться, что они завершены. В настоящее время этот таймер равен 1 секунде. Поэтому, если пакет не заполняется (например, вы просто отправляете 50 одновременных операций), это повлияет на общую производительность, поскольку время отправки велико (это особый момент, о котором мы хотим получить отзывы пользователей).) «.