【问题标题】:Send heartbeat in long running hangfire process在长时间运行的hangfire进程中发送心跳
【发布时间】:2020-07-30 06:29:00
【问题描述】:

是否可以向hangfire(Redis Storage)发送心跳来告诉系统该进程还活着?目前我将InvisibilityTimeout 设置为TimeSpan.MaxValue 以防止hangfire 重新启动作业。但是,如果进程失败或服务器重新启动,该作业将永远不会从正在运行的作业列表中删除。所以我的想法是,消除大超时并发送一种心跳。这可能吗?

【问题讨论】:

  • 服务器重启时是否有多个实例在运行?
  • @jayasurya_j 你是什么意思?我认为目前不会,因为hangfire 没有意识到工作会消亡。
  • 我想写一个永远监听队列的作业(在无限循环中运行),我想将超时设置为最大值,但是因为我在启动时使用了 BackgroundJob.Enqueue().. cs 我认为每次服务器启动或每次新部署发生时,我们都在排队一个永远运行的工作。所以不知道如何在hangfire中实现一个永远运行的工作。有什么想法吗?
  • @jayasurya_j 有同样的问题,所以目前没有:) 可以将后台作业用于长时间运行的进程。但他们没有安排。并且未显示在仪表板中。此外,从仪表板启动和服务器启动后也是不可能的。
  • 这是一个关于 Hangfire 的长期开放错误。 github.com/HangfireIO/Hangfire/issues/1197 所以不确定是否真的有一个好的解决方案 atm。我,我会重写这项工作,而不是一个永恒的循环,一旦完成就重新安排自己。

标签: c# .net-core scheduled-tasks hangfire


【解决方案1】:

我找到了https://discuss.hangfire.io/t/hangfire-long-job-stop-and-restart-several-time/4282/2,它涉及如何在 Hangfire 中保持长期工作的活力。 User zLanger 表示,一旦你...

[...] 正在点击 hangfire 的 invisibilityTimeout。你有两个选择。

  • 将超时时间增加到超过作业运行所需的时间
  • 让作业发送心跳,让 hangfire 知道它还活着。

这对你来说并不新鲜。但有趣的是,接下来的问题是:

你如何在工作中实现心跳?

这仍然没有答案,暗示您的问题确实不是微不足道的。

我从未在 Hangfire 中处理过长时间运行的作业,但我从其他排队系统(例如 former SunGrid Engine)知道问题所在,这就是我对您的问题感兴趣的原因。

过去,我在 SunGrid 上遇到过你的问题,部门的计算机专家告诉我,根据一些数学排队理论,应该不惜一切代价避免长时间运行的工作(我会尝试联系他并找到参考资料到他引用的书)。他的想法也许值得与你分享:

如果您有一些作业花费的时间超过排队系统允许的最大运行时间,请不要提交作业本身,而是多次调用能够 (1) 启动的包装脚本,( 2) freeze-stop, (3) unfreeze-continue 实际任务。

这个 stop-continue 确实可以是操作系统级别的挂起(CTRL+Z 分别是 Linux 中的 fg),参见例如unix.stackexchange.com on that issue

实际上,我有二进制文件myMonteCarloExperiment.x 和包装脚本myMCjobStarter.sh。我的最大计算时间是一天。我会用数百个包装脚本调用来填充队列,其边界条件是一次只能运行一个。该脚本将检查是否已经在计算集群的任何位置启动了进程myMonteCarloExperiment.x,如果没有,它将启动一个实例。如果有一个暂停的进程,包装脚本会转发它并让它运行 23 小时 55 分钟,然后暂停该进程。在任何其他情况下,包装脚本都会报告错误。

这种方法没有实现作业心跳,但它确实运行了一个冗长的作业。它还避免了必须清理 Hangfire 的作业日志,从而使队列管理员感到满意。

更多参考资料

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多