Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
В этой статье рассматриваются рекомендации по использованию пакета SDK .NET для Azure Cosmos DB. Следуя этим рекомендациям, вы можете повысить задержку, доступность и повысить общую производительность.
Просмотрите следующее видео, чтобы узнать больше об использовании пакета SDK для .NET от инженера Azure Cosmos DB!
Контрольный список
Флажок | Тема | Описание |
---|---|---|
Версия пакета SDK | Всегда используйте последнюю версию пакета SDK Azure Cosmos DB, доступную для оптимальной производительности. | |
Одноэлементный клиент | Для оптимальной производительности используйте CosmosClient на протяжении времени существования приложения. |
|
Регионы | Не забудьте запустить приложение в том же регионе Azure , что и учетная запись Azure Cosmos DB, когда это возможно, чтобы уменьшить задержку. Для повышения доступности включите 2–4 региона и репликацию учетных записей в нескольких регионах. Для производственных нагрузок включите переключение при отказе, управляемое службой. В отсутствие этой конфигурации учетная запись теряет возможность записи на протяжении всего периода сбоя региона записи, поскольку отказоустойчивость вручную не удается из-за отсутствия подключения к региону. Сведения о добавлении нескольких регионов с помощью пакета SDK для .NET см. в этом руководстве. | |
Доступность и переключение при отказе | Задайте ApplicationPreferredRegions или ApplicationRegion в версии 3 пакета SDK и PreferredLocations в версии 2 пакета SDK с помощью списка предпочтительных регионов. Во время переключения операции записи направляются в текущую зону записи, а все операции чтения — в первую зону в списке предпочтительных зон. Дополнительные сведения о региональных механизмах аварийного переключения см. в руководстве по обеспечению доступности. | |
ЦП | Проблемы с подключением и доступностью могут возникнуть из-за нехватки ресурсов на клиентском компьютере. Отслеживайте использование ЦП на узлах, где работает клиент Azure Cosmos DB, и масштабируйте вверх или наружу, если использование ЦП высокое. | |
Хостинг | Для повышения производительности рекомендуется вести обработку на узлах 64-разрядной версии Windows. Для рабочих нагрузок с учетом задержки в режиме Direct настоятельно рекомендуется использовать по крайней мере 4 ядра и виртуальные машины памяти размером 8 ГБ, когда это возможно. | |
Режимы подключения | Используйте прямой режим для оптимальной производительности. Инструкции см. в документации по пакету SDK версии 3 или документации по пакету SDK версии 2. | |
Сеть | Если вы используете для запуска приложения виртуальную машину, включите на ней ускорение сети, чтобы устранить узкие места при большом объеме трафика и уменьшить задержку или нагрузку на ЦП. Вы также можете рассмотреть возможность использования виртуальной машины премиум-класса, где максимальное использование ЦП составляет менее 70%. | |
Временная нехватка портов | Для редких и периодических соединений мы устанавливаем для параметров IdleConnectionTimeout и PortReuseMode значение PrivatePortPool . Свойство IdleConnectionTimeout помогает управлять временем закрытия неиспользуемых подключений. Это уменьшает количество неиспользуемых подключений. По умолчанию неактивные соединения остаются открытыми в течение неограниченного времени. Это значение должно быть не меньше 10 минут. Мы рекомендуем использовать значения от 20 минут до 24 часов. Свойство PortReuseMode позволяет пакету SDK использовать небольшой пул временных портов для разных конечных точек назначения Azure Cosmos DB. |
|
Используйте async/await | Избегайте блокирующих вызовов Task.Result , Task.Wait и Task.GetAwaiter().GetResult() . Весь стек вызовов является асинхронным, чтобы использовать преимущества шаблонов async/await. Множество синхронных блокирующих вызовов ведут к истощению ресурсов пула потоков и увеличению времени отклика. |
|
Сквозные тайм-ауты | Для получения сквозных тайм-аутов необходимо использовать параметры RequestTimeout и CancellationToken . Дополнительные сведения см. в нашем руководстве по устранению неполадок тайм-аутов. |
|
Логика повторных попыток | Дополнительные сведения о том, какие ошибки следует повторить и какие из них повторяются пакетами SDK, см. в руководстве по проектированию. Для учетных записей, настроенных с несколькими регионами, существуют некоторые сценарии, при которых пакет SDK автоматически повторяет попытки в других регионах. Для сведений о реализации, специфичных для .NET, см. в исходном репозитории пакета SDK. | |
Кэширование имен баз данных и коллекций | Извлеките имена ваших баз данных и контейнеров из конфигурации или кэшируйте их при запуске. Вызовы, такие как ReadDatabaseAsync или ReadDocumentCollectionAsync , и CreateDatabaseQuery или CreateDocumentCollectionQuery приводят к вызовам метаданных к службе, что потребляется из ограничения на RU, зарезервированного системой.
CreateIfNotExist также следует использовать только один раз для настройки базы данных. Не стоит выполнять эти операции слишком часто. |
|
Массовая поддержка | В случаях, когда оптимизация задержки не является необходимой, рекомендуется включить поддержку пакетной обработки для дампа больших объемов данных. | |
Параллельные запросы | Пакет SDK Azure Cosmos DB поддерживает параллельное выполнение запросов для повышения задержки и пропускной способности в запросах. Рекомендуется задавать для свойства MaxConcurrency в QueryRequestsOptions значение, равное числу разделов. Если вы не знаете количество секций, начните с использования int.MaxValue , что обеспечивает лучшую задержку. Затем уменьшайте это число до тех пор, пока оно не будет соответствовать ограничениям ресурсов среды, чтобы избежать проблем с ЦП. Кроме того, задайте MaxBufferedItemCount ожидаемое количество результатов, возвращаемых, чтобы ограничить количество предварительно подготовленных результатов. |
|
Откаты тестирования производительности | При тестировании в приложении следует реализовать задержки с интервалом RetryAfter . Уважение отката помогает обеспечить минимальное время ожидания между повторными попытками. |
|
Индексирование | Политика индексирования Azure Cosmos DB также позволяет указать, какие пути документа следует включать или исключать из индексирования с помощью путей индексирования (IndexingPolicy.IncludedPaths и IndexingPolicy.ExcludedPaths ). Исключите из индексирования неиспользуемые пути, чтобы ускорить выполнение операций записи. Дополнительные сведения о создании индексов с помощью пакета SDK см. в разделе "Политика индексирования". |
|
Размер документа | Плата за запрос (т. е. затраты на обработку запросов) указанной операции напрямую зависит от размера документа. Рекомендуется уменьшить размер документов, так как операции с большими документами стоят больше, чем с меньшими. | |
Увеличение количества потоков или задач | Так как вызовы Cosmos DB выполняются по сети, может потребоваться изменить степень параллелизма запросов, чтобы клиентское приложение тратило минимальное количество времени на ожидание между запросами. Например, если вы используете библиотеку параллельных задач .NET, создайте около нескольких сотен задач считывания или записи в Azure Cosmos DB. | |
Включение метрик запросов | Для дополнительного журналирования запросов в серверной части можно включить метрики запросов SQL с помощью нашего пакета SDK для .NET. Дополнительные сведения о сборе метрик SQL Query см. в разделе метрики запросов и производительность. | |
Логирование SDK | Включите ведение журнала диагностики для пакета SDK для незавершенных сценариев, например, из-за появления исключений или превышения ожидаемой задержки для запросов. | |
ДефолтТрейсЛистенер | Проблемы DefaultTraceListener с производительностью в рабочих средах вызывают узкие места ЦП и ввода-вывода. Убедитесь, что вы используете последние версии пакета SDK или удалите DefaultTraceListener из приложения. |
|
Избегайте использования специальных символов в идентификаторах | Некоторые символы ограничены и не могут использоваться в некоторых идентификаторах: / , \ , . ? # Общая рекомендация заключается в том, чтобы не использовать специальные символы в идентификаторах, таких как имя базы данных, имя коллекции, идентификатор элемента или ключ секции, чтобы избежать непредвиденного поведения. |
Сбор диагностических данных
Для всех ответов в пакете SDK, включая CosmosException
, доступно свойство Diagnostics
. В это свойство записываются все сведения, связанные с одним запросом, в том числе сведения о повторных попытках и временных сбоях.
Система возвращает данные свойства в виде строки. От версии к версии содержимое этой строки изменяется. Это связано с совершенствованием программного обеспечения для улучшения процесса устранения неполадок в различных сценариях. В каждой версии пакета SDK будут критические изменения форматирования этой строки. Не анализируйте строку, чтобы избежать проблем, связанных с обратимыми изменениями. В следующем примере кода показано, как выполнять чтение данных из журналов диагностики с помощью пакета SDK для .NET.
try
{
ItemResponse<Book> response = await this.Container.CreateItemAsync<Book>(item: testItem);
if (response.Diagnostics.GetClientElapsedTime() > ConfigurableSlowRequestTimeSpan)
{
// Log the response.Diagnostics.ToString() and add any additional info necessary to correlate to other logs
}
}
catch (CosmosException cosmosException)
{
// Log the full exception including the stack trace with: cosmosException.ToString()
// The Diagnostics can be logged separately if required with: cosmosException.Diagnostics.ToString()
}
// When using Stream APIs
ResponseMessage response = await this.Container.CreateItemStreamAsync(partitionKey, stream);
if (response.Diagnostics.GetClientElapsedTime() > ConfigurableSlowRequestTimeSpan || !response.IsSuccessStatusCode)
{
// Log the diagnostics and add any additional info necessary to correlate to other logs with: response.Diagnostics.ToString()
}
Рекомендации по HTTP-подключениям
Пакет SDK для .NET используется HttpClient
для выполнения HTTP-запросов независимо от настроенного режима подключения.
- В режиме Direct HTTP используется для операций метаданных
- В режиме шлюза HTTP используется как для операций уровня данных, так и для операций метаданных
Одним из основных принципов HttpClient является обеспечение реагирования HttpClient
на изменения DNS в учетной записи путем настройки времени существования подключения в пуле. Если пуловые подключения открыты, они не реагируют на изменения DNS. Этот параметр позволяет периодически закрывать пуловые подключения, гарантируя, что приложение реагирует на изменения DNS. Наша рекомендация заключается в том, что вы настраиваете это значение в соответствии с режимом подключения и рабочей нагрузкой, чтобы сбалансировать влияние производительности часто создаваемых новых подключений с необходимостью реагировать на изменения DNS (доступность). 5-минутное значение будет хорошим началом, которое может быть увеличено, если это влияет на производительность, особенно для режима шлюза.
Вы можете внедрить свой пользовательский HttpClient через CosmosClientOptions.HttpClientFactory
, например:
// Use a Singleton instance of the SocketsHttpHandler, which you can share across any HttpClient in your application
SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler();
// Customize this value based on desired DNS refresh timer
socketsHttpHandler.PooledConnectionLifetime = TimeSpan.FromMinutes(5);
CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
{
// Pass your customized SocketHttpHandler to be used by the CosmosClient
// Make sure `disposeHandler` is `false`
HttpClientFactory = () => new HttpClient(socketsHttpHandler, disposeHandler: false)
};
// Use a Singleton instance of the CosmosClient
return new CosmosClient("<connection-string>", cosmosClientOptions);
При использовании внедрения зависимостей .NET можно упростить одноэлементный процесс:
SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler();
// Customize this value based on desired DNS refresh timer
socketsHttpHandler.PooledConnectionLifetime = TimeSpan.FromMinutes(5);
// Registering the Singleton SocketsHttpHandler lets you reuse it across any HttpClient in your application
services.AddSingleton<SocketsHttpHandler>(socketsHttpHandler);
// Use a Singleton instance of the CosmosClient
services.AddSingleton<CosmosClient>(serviceProvider =>
{
SocketsHttpHandler socketsHttpHandler = serviceProvider.GetRequiredService<SocketsHttpHandler>();
CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
{
HttpClientFactory = () => new HttpClient(socketsHttpHandler, disposeHandler: false)
};
return new CosmosClient("<connection-string>", cosmosClientOptions);
});
Рекомендации по использованию режима шлюза
Увеличивайте System.Net MaxConnections
на хост при использовании режима шлюза. При использовании режима шлюза запросы Azure Cosmos DB выполняются по протоколу HTTPS/REST. К ним применяются ограничения на количество подключений по умолчанию для каждого имени узла или IP-адреса. Может потребоваться задать для параметра MaxConnections
более высокое значение (от 100 до 1000), чтобы клиентская библиотека могла использовать несколько одновременных подключений к Azure Cosmos DB. В SDK версии 1.8.0 для .NET и более поздних версий значение по умолчанию для параметра ServicePointManager.DefaultConnectionLimit
равно 50. Чтобы изменить значение, можно задать для CosmosClientOptions.GatewayModeMaxConnectionLimit
более высокое значение.
Рекомендации для интенсивных по записи рабочих нагрузок
Для рабочих нагрузок с интенсивным созданием данных установите для параметра запроса EnableContentResponseOnWrite
значение false
. Служба больше не возвращает созданный или обновленный ресурс в пакет SDK. Как правило, поскольку приложение имеет создаваемый объект, служба не должна его возвращать. Значения заголовков по-прежнему доступны, например плата за запрос. Отключение реагирования на содержимое может помочь повысить производительность, поскольку пакету SDK больше не требуется выделять память или сериализовать текст ответа. Это также сокращает использование пропускной способности сети для еще большего повышения производительности.
Внимание
Настройка EnableContentResponseOnWrite
на false
также отключает ответ на операцию триггера.
Наилучшие практики для мультитенантных приложений
Приложения, которые распределяют использование между несколькими арендаторами, где каждый арендатор представлен отдельной базой данных, контейнером или ключом раздела в одной и той же учетной записи Azure Cosmos DB, должны использовать один экземпляр клиента. Один экземпляр клиента может взаимодействовать со всеми базами данных, контейнерами и ключами секций в учетной записи, и рекомендуется использовать единый шаблон.
Однако, если каждому арендатору соответствует отдельная учетная запись Azure Cosmos DB, необходимо создать отдельный экземпляр клиента для каждой учетной записи. Шаблон одиночки по-прежнему применяется для каждого клиента (один клиент для каждой учетной записи на время существования приложения), но если объем арендаторов высок, количество клиентов может быть трудно контролировать. Подключения могут увеличиваться за пределы вычислительной среды и вызывать проблемы с подключением.
В этих случаях рекомендуется:
- Ознакомьтесь с ограничениями вычислительной среды (ресурсы ЦП и подключения). По возможности рекомендуется использовать виртуальные машины с не менее 4 ядрами и 8 ГБ памяти.
- В зависимости от ограничений вычислительной среды определите количество инстансов клиента (и, следовательно, количество арендаторов), которые может обработать один вычислительный экземпляр. Можно оценить количество подключений, открытых для каждого клиента в зависимости от выбранного режима подключения.
- Оцените распределение клиентов между экземплярами. Если каждый вычислительный экземпляр может успешно обрабатывать определенный объем клиентов, балансировка нагрузки и маршрутизация клиентов в разные вычислительные экземпляры позволит масштабироваться по мере увеличения числа клиентов.
- Для разреженных рабочих нагрузок рекомендуется использовать кэш с наименее часто используемыми значениями в качестве структуры хранения экземпляров клиентов и удаления клиентов для арендаторов, к которым не обращаются в течение заданного времени. Одним из вариантов в .NET является MemoryCacheEntryOptions, где RegisterPostEvictionCallback можно использовать для удаления неактивных клиентов и SetSlidingExpiration можно использовать для определения максимального времени хранения неактивных подключений.
- Оцените использование режима шлюза для уменьшения числа сетевых подключений.
- При использовании режима Direct рекомендуется настроить CosmosClientOptions.IdleTcpConnectionTimeout и CosmosClientOptions.PortReuseMode в конфигурации прямого режима , чтобы закрыть неиспользуемые подключения и сохранить объем подключений под контролем.
Следующие шаги
- Измерение производительности Azure Cosmos DB для NoSQL с помощью платформы тестирования
- Секционирование и горизонтальное масштабирование в Azure Cosmos DB
Занимаетесь планированием емкости для миграции в Azure Cosmos DB? Для планирования ресурсов можно использовать сведения об имеющемся кластере базы данных.
- Если вы знаете типичные скорости запросов для текущей рабочей нагрузки базы данных, см. статью "Оценка RU/s с помощью планировщика емкости Azure Cosmos DB.