c# - 在长时间运行的 Hangfire 进程中发送心跳

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

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

最佳答案

我找到了 https://discuss.hangfire.io/t/hangfire-long-job-stop-and-restart-several-time/4282/2它涉及如何在 Hangfire 中保持长期运行的工作。
User zLanger说工作被认为是死的,一旦你......

[...] are hitting hangfire’s invisibilityTimeout. You have two options.

  • increase the timeout to more than the job will ever take to run
  • have the job send a heartbeat to let hangfire’s know it’s still alive.


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

How do you implement heartbeat on job?



这在那里仍未得到解答,暗示您的问题确实不是微不足道的。

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

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

如果您有一些作业需要的时间超过排队系统的容许最大运行时间,请不要提交作业本身,而是多次调用能够(1)启动,(2)卡住停止, (3)解冻——继续实际任务。

这种停止-继续确实可以是操作系统级别的暂停(CTRL+Z 分别是 fg 在 Linux 中),例如参见unix.stackexchange.com on that issue .

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

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

进一步引用
  • How to prevent a Hangfire recurring job from restarting after 30 minutes of continuous execution似乎很好读
  • 关于c# - 在长时间运行的 Hangfire 进程中发送心跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61260026/

    相关文章:

    c# - 混合模式 C++/CLI 崩溃 : heap corruption in atexit (static destructor registration)

    c# - Linq GroupBy - 如何在运行时指定分组键?

    .net - 视频编辑付费或免费,但不是 FFMpeg

    c# - Newtonsoft.Json.Linq.JObject.ToObject() 以字符串格式转换日期

    c# - 针对 Linux Docker 容器创建长期运行的 .NET Core 服务

    spring - 设置Spring任务的线程池名称

    c# - 如何安排 C# Windows 服务每天运行一个方法?

    c# - 霍夫变换问题

    python - Windows 7 任务计划程序和 Python - 壁纸不变

    powershell - 保持 PowerShell 窗口打开和任务计划程序