gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:14:24 33 4
gpt4 key购买 nike

是否可以向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/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com