簡體   English   中英

在長時間運行的hangfire進程中發送心跳

[英]Send heartbeat in long running hangfire process

是否可以向hangfire(Redis Storage)發送心跳以告訴系統該進程還活着? 目前我將InvisibilityTimeout設置為TimeSpan.MaxValue以防止 hangfire 重新啟動作業。 但是,如果進程失敗或服務器重新啟動,該作業將永遠不會從正在運行的作業列表中刪除。 所以我的想法是,消除大超時並發送一種心跳。 這可能嗎?

我找到了 https://discuss.hangfire.io/t/hangfire-long-job-stop-and-restart-several-time/4282/2 ,它涉及如何在 Hangfire 中保持長期運行的工作。 用戶 zLanger說,一旦你...

[...] 正在擊中 hangfire 的invisibilityTimeout 你有兩個選擇。

  • 將超時時間增加到超過作業運行所需的時間
  • 讓工作發送心跳,讓hangfire 知道它還活着。

這對你來說並不新鮮。 但有趣的是,接下來的問題是:

你如何在工作中實現心跳?

那里仍然沒有答案,暗示您的問題確實不是微不足道的。

我從未在 Hangfire 中處理過長期運行的工作,但我知道其他排隊系統(如前 SunGrid Engine )的問題,這就是我對您的問題感興趣的原因。

以前,我在 SunGrid 上遇到過你的問題,部門的計算機大師告訴我,根據一些數學排隊理論,應該不惜一切代價避免長時間運行的工作(我會嘗試聯系他並找到該書的參考資料)他引用)。 他的想法也許值得與你分享:

如果您的某些作業花費的時間超過了排隊系統所允許的最大運行時間,請不要提交作業本身,而是多次調用能夠(1)啟動,(2)凍結停止, (3) unfreeze——繼續實際任務。

這種停止-繼續確實可以是操作系統級別的暫停(在 Linux 中分別為CTRL+Zfg ),請參見例如unix.stackexchange.com 關於該問題

在實踐中,我有二進制myMonteCarloExperiment.x和包裝腳本myMCjobStarter.sh 我的最大計算時間是一天。 我會用數百個包裝腳本調用來填充隊列,其邊界條件是一次只能運行一個。 該腳本將檢查是否已經在計算集群的任何位置啟動了進程myMonteCarloExperiment.x ,如果沒有,它將啟動一個實例。 如果有一個暫停的進程,包裝腳本會轉發它並讓它運行 23 小時 55 分鍾,然后暫停該進程。 在任何其他情況下,包裝腳本都會報告錯誤。

這種方法沒有實現作業心跳,但它確實運行了一個冗長的作業。 通過避免必須清理 Hangfire 的作業日志,它還使隊列管理員感到高興。

更多參考資料

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM