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

Timer 如何从web服务器重启(或代码刷新/升级)恢复Go计时器?,timer,go,goji,Timer,Go,Goji,例如,考虑一个web服务,在该服务中,用户可以发出API请求,以便在特定的计划时间启动任务。任务定义和计划时间保存在数据库中。 我想到的第一种方法是启动一个Go计时器,并等待计时器在Goroutine中过期(而不是阻止请求)。此goroutine在时间到期后还将触发另一个API请求以开始执行任务 现在,重新部署此服务时会出现问题。对于零停机部署,我正在使用。在重新加载代码之后,显然计时器goroutine和计时器过期处理程序goroutine都会死亡。有没有办法在重新加载代码后恢复Go计时器 我

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

现在,重新部署此服务时会出现问题。对于零停机部署,我正在使用。在重新加载代码之后,显然计时器goroutine和计时器过期处理程序goroutine都会死亡。有没有办法在重新加载代码后恢复Go计时器

我正在努力解决的另一个问题是允许用户中断计时器(一旦计时器启动)。围棋计时器必须促进这一点。但由于这是一个无状态API,当
\interrupt
请求进入服务时,没有计时器通道的上下文。而且似乎不可能将通道(从返回的)封送到磁盘/db


很可能我没有从正确的角度看待这个问题。任何建议都将不胜感激。

一种常用的方法是在应用程序之外安排任务,例如使用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,但更复杂。

我会使用外部任务队列服务来实现这一点,使其与服务本身隔离。但是,如果出现任何硬件故障或服务器重新启动,所有计划的cronjob(仍在等待)都将消失。为了避免这种情况,我需要创建某种注册表,在其中注册所有挂起的cronjob。