2014-10-10 15 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

相关问题