在长时间运行的hangfire过程中发送心跳

问题描述 投票:3回答:1

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

c# .net-core scheduled-tasks hangfire
1个回答
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)冻结停止,(3)取消冻结,继续执行实际任务。

此停止继续确实可以是操作系统级别的挂起(Linux中分别为CTRL+Zfg),请参见例如unix.stackexchange.com on that issue

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

此方法不会实现作业心跳,但确实会执行冗长的作业。通过避免必须清除Hangfire的作业日志,这也使队列管理员感到满意。

更多参考

© www.soinside.com 2019 - 2024. All rights reserved.