如何从Web服务器重启(或代码刷新/升级)恢复Go计时器?

时间:2014-10-10 09:54:56

标签: timer go goji

例如,考虑一个Web服务,用户可以在某个预定时间发出API请求来启动任务。任务定义和计划时间保留在数据库中。 我想出的第一种方法是启动Go计时器并等待计时器在Goroutine中过期(不阻止请求)。在时间到期后,此goroutine还将触发另一个API请求以开始执行任务。

现在,重新部署此服务时出现问题。对于零停机部署,我使用Einhorngoji。代码重新加载后,显然定时器goroutine和timer-expiration-handler goroutine都会死掉。有没有办法在代码重新加载后恢复Go计时器?

我正在努力解决的另一个问题是允许用户中断定时器(一旦启动)。 Go计时器有Stop来促进这一点。但由于这是一个无状态API,当\interrupt请求投入使用时,没有定时器通道的上下文。似乎无法将通道(从NewTimer返回)编组到磁盘/数据库。

我也很有可能从正确的角度来看这个问题。任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分: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,但更复杂。