例如,考慮一個Web服務,用戶可以在某個預定時間發出API請求來啓動任務。任務定義和計劃時間將保存在數據庫中。 我想出的第一種方法是啓動一個Go計時器並等待計時器在Goroutine中過期(而不是阻止請求)。這個goroutine在時間到期後還會觸發另一個API請求來開始執行任務。如何從Web服務器重啓(或代碼刷新/升級)恢復Go定時器?
現在問題出現在重新部署此服務時。爲了零宕機部署,我使用Einhorn和goji。代碼重新加載後,顯然定時器goroutine和定時器到期處理程序goroutine都會死亡。代碼重新加載後有什麼辦法恢復Go計時器?
我正在努力的另一個問題是允許用戶中斷計時器(一旦它啓動)。去定時器有Stop,以方便這一點。但是由於這是一個無狀態的API,所以當\interrupt
請求進入服務時不具有定時器通道的上下文。並且它似乎不可能編組通道(從NewTimer返回)到磁盤/分區。
它也很有可能,我沒有從正確的角度看待問題。任何建議將不勝感激。
我會使用外部任務隊列服務來做到這一點,以保持與服務本身的隔離。 – 2014-10-10 11:50:45