Azure WebJob Throwing HttpRequestException - PullRequest
0 голосов
/ 24 марта 2019

Я размещаю приложение в Azure в виде непрерывного веб-задания.Программа часто (примерно раз в секунду) выполняет вызовы базы данных CosmosDB путем создания экземпляра DocumentClient (я использую функцию DocumentClient CreateDocumentQuery и запрос Linq для результирующего IEnumberable для извлечения объектов из моей базы данных).Когда я запускаю программу локально, она ведет себя, как и ожидалось, без каких-либо проблем.Когда я публикую программу в качестве веб-задания Azure и запускаю ее, мои журналы показывают, что возникает исключение HttpRequestException с сообщением: «Произошла ошибка при отправке запроса».Кроме того, я получаю следующую трассировку стека:

в System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) в System.Threading.Tasks.Task1.GetResultCore (логическое waitCompletionNotification) в System..Tasks.Task1.get_Result () в Microsoft.Azure.Documents.Linq.DocumentQuery1.d__31.MoveNext () в System.Linq.Enumerable.FirstOrDefault [TSource] (источник IEnumerable`1) в ... моем вызовеcode ...

Эта проблема возникает только тогда, когда я часто использую DocumentClient и только на стороне WebJob.Запуск эквивалентной загрузки локально не беспокоит мое приложение.Почему это исключение происходит в моем WebJob?Возможно, стоит отметить, что эта проблема возникает с уровнями службы приложений S1 и P1V2.

1 Ответ

0 голосов
/ 25 марта 2019

DocumentClient не следует использовать отдельно для каждого запроса, вместо этого вы должны использовать его как единичный экземпляр в вашем приложении. Создание клиентского запроса добавит много времени на задержку.

Так что я бы объявил свойство Client как «статическое» и инициализировал его в конструкторе Service. Вы можете вызвать await Client.OpenAsync() в методе Connect для «разогрева» клиента, а в каждом из ваших открытых методов напрямую использовать экземпляр Client для вызова API DocumentDB.

Утилизируйте клиента в методе утилизации Сервиса.

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

https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#sdk-usage

Надеюсь, это поможет!

...