Ограничение по времени для веб-заданий Azure, инициированных очередью

Существуют ли какие-либо ограничения по времени для функции, запускаемой очередью, внутри задания лазурного Интернета. Моя функция занимает около 20-30 минут, так как ей нужно просмотреть много записей в БД. Статус функции в конце - Never Finished. Я вставил файл settings.job с {"stopping_wait_time": 1800} - безрезультатно. Но примерно через пять минут его статус будет установлен на «Никогда не завершено». Я искал и да нашел, что некоторые люди задают похожие вопросы - без окончательных ответов. Я обнаружил некоторые исключения в журналах, и, похоже, исключения были созданы из хранилища Azure. Я поискал и обнаружил, что есть некоторые проблемы с журналированием, поэтому я закомментировал код журналирования в функции - все равно не пошло. Также я нашел один вопрос, в котором упоминались некоторые строки подключения - теперь они у меня есть; AzureWebJobsStorage, AzureWebJobsDashboard, AzureJobsRuntime, AzureJobsData - все они указывают на одну и ту же учетную запись хранения - все равно никуда.

Я попытался отладить и посмотреть, где происходит тайм-аут, и кажется, что это происходит еще до того, как моя функция действительно сработала,

Результат выглядит примерно так:

A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll
A first chance exception of type 'System.TimeoutException' occurred in Microsoft.WindowsAzure.Storage.dll
A first chance exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.WindowsAzure.Storage.dll
A first chance exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.WindowsAzure.Storage.dll
A first chance exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in mscorlib.dll
A first chance exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in mscorlib.dll
A first chance exception of type 'Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.Azure.WebJobs.Host.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>PnCProcessor.exe</AppDomain><Exception><ExceptionType>Microsoft.WindowsAzure.Storage.StorageException, Microsoft.WindowsAzure.Storage, Version=4.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ExceptionType><Message>The client could not finish the operation within specified timeout.</Message><StackTrace>   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result)
at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.EndExists(IAsyncResult asyncResult)
at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.&amp;lt;&amp;gt;c__DisplayClass1`1.&amp;lt;CreateCallback&amp;gt;b__0(IAsyncResult ar)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Queues.Listeners.QueueListener.&amp;lt;ExecuteAsync&amp;gt;d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Timers.TaskSeriesTimer.&amp;lt;RunAsync&amp;gt;d__d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.&amp;lt;&amp;gt;c__DisplayClass1.&amp;lt;Throw&amp;gt;b__0()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()</StackTrace><ExceptionString>Microsoft.WindowsAzure.Storage.StorageException: The client could not finish the operation within specified timeout. ---&amp;gt; System.TimeoutException: The client could not finish the operation within specified timeout.
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result)
at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.EndExists(IAsyncResult asyncResult)
at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.&amp;lt;&amp;gt;c__DisplayClass1`1.&amp;lt;CreateCallback&amp;gt;b__0(IAsyncResult ar)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Queues.Listeners.QueueListener.&amp;lt;ExecuteAsync&amp;gt;d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Timers.TaskSeriesTimer.&amp;lt;RunAsync&amp;gt;d__d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.&amp;lt;&amp;gt;c__DisplayClass1.&amp;lt;Throw&amp;gt;b__0()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Request Information
RequestID:
RequestDate:
StatusMessage:
</ExceptionString><InnerException><ExceptionType>System.TimeoutException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>The client could not finish the operation within specified timeout.</Message><StackTrace>   at Microsoft.Azure.WebJobs.Host.Timers.BackgroundExceptionDispatcher.&amp;lt;&amp;gt;c__DisplayClass1.&amp;lt;Throw&amp;gt;b__0()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

System.TimeoutException: клиенту не удалось завершить операцию в течение указанного времени ожидания.

Я использую для этого веб-приложение S1 и стандартную учетную запись хранения GRS.

Итак, вопросы:
1. Существуют ли какие-либо временные ограничения на время, необходимое для запуска функции очереди?
2. Если есть временные ограничения, есть ли способ отменить их?
3. Я должен использовать функция, запускаемая очередью, поскольку мне нужно передать функции некоторые параметры, которые передаются из другого запланированного веб-задания. Я могу создать веб-задание по запросу и передать параметры в командной строке, но есть ли способ вызвать веб-задание по запросу из запланированного веб-задания?

Спасибо за вашу помощь!


person user5845859    schedule 27.01.2016    source источник
comment
Из трассировки стека похоже, что вы получаете тайм-ауты хранилища во время инициализации запуска (например, проверка, существует ли очередь). Это указывает на проблему с вашей учетной записью хранения или строкой подключения. Убедитесь, что это правильно. Также, пожалуйста, предоставьте подробную информацию о том, как вы выполняете это задание - запускаемое / непрерывное и т. Д.   -  person mathewc    schedule 27.01.2016
comment
спасибо за ваш ответ, Мэтью, это тоже была моя гипотеза - однако та же самая настройка работала нормально, когда функция имела меньшее количество записей для обработки, а функция завершалась за гораздо меньшее время. Еще одна вещь, которая, как я подозреваю, может быть связана с этим, заключается в том, что в той же учетной записи хранения была очередь, которая изначально создавала эти записи, например, около 500 000 сообщений. Итак, в контейнере BLOB-объектов много-много файлов - имеет ли это значение? и есть ли способ их удалить?   -  person user5845859    schedule 27.01.2016
comment
..и задание запускается через очередь   -  person user5845859    schedule 27.01.2016
comment
хорошо, я удалил старое хранилище, создал новое. Изменено хранилище AzureWebJobsStorage, AzureWebJobsDashboard, чтобы оно указывало на новый. Я изменил функцию, запускаемую очередью, чтобы просто выплюнуть одно сообщение в TextWriter и вернуться. Все это сработало. Итак, функция очереди-хранилища-журнала работает. Однако, если я снова изменю функцию для выполнения длительной работы, она снова будет убита. И снова тот же вопрос. Есть ли ограничение по времени для функции, которая запускается сообщением вне очереди?   -  person user5845859    schedule 29.01.2016


Ответы (1)


Нет ограничений на время выполнения функций заданий, запускаемых очередью. Однако есть несколько вещей, которые вы должны правильно настроить, чтобы ваш JobHost продолжал работать. При использовании пакета SDK для веб-заданий Azure необходимо развернуть JobHost Console exe как постоянно выполняющееся веб-задание и включить Всегда включен. Оба они подробно описаны в этой документации. страницу в разделе «Создать постоянно работающее веб-задание».

См. Раздел «Примечания» на этой странице для получения подробной информации об ограничениях времени ожидания при работе на уровне бесплатного пользования (время ожидания 20 минут), которые можно удалить, перейдя на уровень «Базовый» или «Стандартный».

person mathewc    schedule 30.01.2016