2014-10-10 16 views
0

例如,考慮一個Web服務,用戶可以在某個預定時間發出API請求來啓動任務。任務定義和計劃時間將保存在數據庫中。 我想出的第一種方法是啓動一個Go計時器並等待計時器在Goroutine中過期(而不是阻止請求)。這個goroutine在時間到期後還會觸發另一個API請求來開始執行任務。如何從Web服務器重啓(或代碼刷新/升級)恢復Go定時器?

現在問題出現在重新部署此服務時。爲了零宕機部署,我使用Einhorngoji。代碼重新加載後,顯然定時器goroutine和定時器到期處理程序goroutine都會死亡。代碼重新加載後有什麼辦法恢復Go計時器?

我正在努力的另一個問題是允許用戶中斷計時器(一旦它啓動)。去定時器有Stop,以方便這一點。但是由於這是一個無狀態的API,所以當\interrupt請求進入服務時不具有定時器通道的上下文。並且它似乎不可能編組通道(從NewTimer返回)到磁盤/分區。

它也很有可能,我沒有從正確的角度看待問題。任何建議將不勝感激。

+5

我會使用外部任務隊列服務來做到這一點,以保持與服務本身的隔離。 – 2014-10-10 11:50:45

回答

1

一種常用的方法是將任務安排在應用程序外部,例如使用crontab或systemd計時器。

例如使用crontab的:

# run every 30 minutes 
*/30 * * * * /usr/bin/curl --head http://localhost/cron?key=something-to-verify-local-job >/dev/null 2>&1 

使用外部任務隊列也是一個有效的選項像@Not_a_Golfer提及,但更爲複雜。

+0

但是,如果有任何硬件故障或服務器重新啓動,那麼所有計劃的cronjobs(仍在等待)都將消失。爲了避免這種情況,我需要創建一些註冊表,以便註冊所有未決的cronjobs。 – shardnit 2014-10-14 13:04:07

相關問題