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

标签 timer go goji

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

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

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

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

最佳答案

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

关于timer - 如何从 Web 服务器重启(或代码刷新/升级)中恢复 Go 计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296664/

相关文章:

timer - 如何重置 dropwizard 指标的计时器?

go - golang包中的redis.v4和redis.v5有什么不同

go - 在 Goji 中映射所有路由及其 http 方法

go - 如何在 Goji (Golang) 中使用不同的中间件创建单独的路由组?

go - 使用 goroutines 处理值并将结果收集到 slice 中

Goji 子路由器返回 404

javascript - document.getElementById ("someid' ).innerHTML = "HI";不适合我

c++ - C++ 中的游戏更新(线程或定时器)?

c - 除了 POSIX 计时器,Linux 中还有哪些其他计时器 API?

go - 如何在Go应用程序内的Elasticsearch中执行嵌套聚合?