例如,考虑一个 Web 服务,用户可以在其中发出 API 请求以在某个预定时间启动任务。任务定义和计划时间保存在数据库中。我想出的第一种方法是启动一个 Go 计时器并等待计时器在 Goroutine 中到期(不阻塞请求)。这个 goroutine 在时间到期后,还会触发另一个 API 请求以开始执行任务。
现在重新部署此服务时会出现问题。对于零停机时间部署,我将Einhorn与goji一起使用。代码重新加载后,显然 timer goroutine 和 timer-expiration-handler goroutine 都会死掉。代码重新加载后有什么方法可以恢复 Go 计时器?
我正在努力解决的另一个问题是允许用户中断计时器(一旦启动)。Go 计时器有Stop来促进这一点。但是由于这是一个无状态的 API,当\interrupt
请求进入服务时没有定时器通道的上下文。而且似乎不可能将通道(从NewTimer返回)编组到磁盘/数据库。
我也很可能没有从正确的角度看待问题。任何建议将不胜感激。