Hangfire - не удалось создать фоновое задание. См внутреннее исключение для деталей

Я создаю задания зависания как `BackgroundJob.Enqueue(x => x.Recalculate(itemID)); поставить в очередь на работу. Когда я пытаюсь сохранить несколько раз подряд, я получаю следующую ошибку от Hangfire.

Вот трассировка стека,

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Dapper.SqlMapper.ExecuteCommand(IDbConnection cnn, CommandDefinition& command, Action`2 paramReader)
   at Dapper.SqlMapper.ExecuteImpl(IDbConnection cnn, CommandDefinition& command)
   at Dapper.SqlMapper.Execute(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType)
   at Hangfire.SqlServer.SqlServerWriteOnlyTransaction.<>c__DisplayClass7_0.<SetJobState>b__0(SqlConnection x)
   at Hangfire.SqlServer.SqlServerWriteOnlyTransaction.<Commit>b__4_0(SqlConnection connection)
   at Hangfire.SqlServer.SqlServerStorage.<>c__DisplayClass17_0.<UseTransaction>b__0(SqlConnection connection)
   at Hangfire.SqlServer.SqlServerStorage.UseConnection[T](Func`2 func)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction[T](Func`2 func, Nullable`1 isolationLevel)
   at Hangfire.SqlServer.SqlServerStorage.UseTransaction(Action`1 action)
   at Hangfire.Client.CoreBackgroundJobFactory.Create(CreateContext context)
   at Hangfire.Client.BackgroundJobFactory.<>c__DisplayClass7_0.<CreateWithFilters>b__0()
   at Hangfire.Client.BackgroundJobFactory.InvokeClientFilter(IClientFilter filter, CreatingContext preContext, Func`1 continuation)
   at Hangfire.Client.BackgroundJobFactory.Create(CreateContext context)
   at Hangfire.BackgroundJobClient.Create(Job job, IState state)

Сообщение об исключении: не удалось создать фоновое задание. См. Внутреннее исключение для деталей.(BackgroundJobClientException)

Внутренний Ex: Истекло время ожидания выполнения. Время ожидания истекло до завершения операции или сервер не отвечает.

Кто-нибудь сталкивался с этой проблемой? Это прекрасно работает на местном уровне. Но проблема возникает в развертывании Azure. Я использую базу данных v12. Ценю любую помощь. Я заметил, что на создание всех заданий на зависание уходит в среднем около 20 секунд, чтобы поставить в очередь фоновое задание. Когда я пытаюсь создать работу снова и снова, она истекает. Время ожидания составляет 30 секунд.

Я пытался увеличить время ожидания подключения, но какое бы значение я ни указывал в строке подключения, похоже, оно истекает через 30 секунд. Но увеличение времени ожидания не решит основную проблему в любом случае.

1 ответ

Решение

Я выяснил, что использование DTU в большинстве случаев составляет 100%, что было неприемлемо, так как в тестовой среде ничего не происходило, когда я это тестировал. Затем я посмотрел на данные о производительности в базе данных Azure, которые дали мне худшие запросы, что было очень удобно. Запрос на удаление заданий вручную был причиной этой проблемы с производительностью. Это была проблема с версией Hangfire, которую мы использовали. Решением было обновить Hangfire до последней версии.

Другие вопросы по тегам