SQL 服务器日志文件因 Hangfire 而增长了 40GB

SQL Server log file grew 40GB with Hangfire

我在 IIS 中使用 MVC 运行 开发了一个 Hangfire 应用程序,它工作得非常好,直到我看到我的 SQL 服务器日志文件的大小,它在一夜之间增长了 40 GB !!

根据我们的 DBA 提供的信息,有一个很长的 运行 事务,具有以下 SQL 语句(我有 2 个 hangfire 队列 )-

(@queues1 nvarchar(4000),@queues2 nvarchar(4000),@timeout float)
delete top (1) from [HangFire].JobQueue with (readpast, updlock, rowlock)
output DELETED.Id, DELETED.JobId, DELETED.Queue
where (FetchedAt is null or FetchedAt < DATEADD(second, @timeout, GETUTCDATE()))
and Queue in (@queues1,@queues2)

在探索 Hangfire 库时,我发现它用于将作业出列,并且执行一个非常简单的任务,不应该花费任何大量时间。 我找不到任何会导致此错误的内容。事务与 using 语句一起正确使用,并且在发生异常时对象为 Disposed

按照一些帖子的建议,我已经检查了我的数据库的恢复模式并验证它很简单。

我已手动终止挂起的事务以回收日志文件 space,但几个小时后它又出现了。我一直在观察。

这种行为的原因可能是什么?以及如何预防?

这个问题似乎是间歇性的,在生产环境中部署可能具有极高的风险:(

从 Hangfire 1.5.0 开始,Hangfire.SqlServer 实现将后台作业的整个处理过程包装在一个事务中。以前的实现使用隐形超时提供至少一次处理保证,无需事务,以防进程意外关闭。

我实现了一种新的队列处理模型,因为新用户有很多困惑,尤其是那些刚刚安装 Hangfire 并在调试会话中使用它的用户。像"Why my job is still under processing state?"这样的问题很多。我考虑过事务日志增长可能存在问题,但我不知道即使使用简单恢复模型也可能会发生这种情况(请参阅 this answer 了解原因)。

看起来应该有一个开关,使用什么队列模型,基于事务(默认)或基于隐形超时.但此功能仅在 1.6 中可用,我还不知道任何预计到达时间。

目前,您可以使用 Hangfire.SqlServer.MSMQ or any other non-RDBMS queue implementations (please see the Extensions 页面)。 Hangfire 的单独数据库也可能有所帮助,尤其是当您的应用程序更改大量数据时。