Creo trabajos de hangfire como `BackgroundJob.Enqueue (x => x.Recalculate (itemID)); poner en cola un trabajo. Cuando intento guardar varias veces consecutivas, aparece el siguiente error de Hangfire.

Aquí está el seguimiento de la pila,

   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)

Mensaje de excepción: Error al crear el trabajo en segundo plano. Consulte la excepción interna para obtener más detalles. (BackgroundJobClientException)

Interno Ex: tiempo de espera de ejecución caducado. El período de tiempo de espera transcurrió antes de la finalización de la operación o el servidor no responde.

¿Alguien se ha encontrado con este problema? Esto funciona bien a nivel local. Pero el problema ocurre en la implementación de Azure. Estoy usando una base de datos v12. Agradezco cualquier ayuda. Me di cuenta de que toda la creación de mi trabajo de hangfire toma como 20 segundos en promedio para poner en cola el trabajo en segundo plano. Cuando intento crear el trabajo una y otra vez, se agota el tiempo de espera. El tiempo de espera parece ser de 30 segundos.

Intenté aumentar el tiempo de espera de la conexión, pero cualquiera que sea el valor que puse en la cadena de conexión, parece que se agota después de 30 segundos. Pero aumentar el tiempo de espera no resolverá el problema subyacente de todos modos.

1
Dhanuka777 14 dic. 2016 a las 08:42
¿Cómo es su gráfico de uso de DTU en su base de datos SQL?
 – 
Dan Rediske
14 dic. 2016 a las 22:22

1 respuesta

La mejor respuesta

Descubrí que el uso de DTU es del 100% la mayor parte del tiempo, lo cual era inaceptable ya que no sucedía mucho en el entorno de prueba en el que estaba probando esto. Luego miré los datos de rendimiento en la base de datos de Azure, lo que me dio las consultas con el peor rendimiento, lo cual fue realmente útil. La consulta de trabajos de eliminación de Handfire estaba causando este problema de rendimiento. Fue un problema con la versión de Hangfire que estábamos usando. La solución fue actualizar Hangfire a la última versión.

1
Dhanuka777 29 dic. 2016 a las 14:42