time.AfterFunc 定时器函数如何避免程序重启造成的中断
time.AfterFunc 定时器如何避免程序重启造成的中断
线上不可避免的会重启进程, 一重启这个定时器就没了, 应该有啥解决办法的吧, 不然这个函数 作用就不太高了
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
time.AfterFunc 定时器如何避免程序重启造成的中断
线上不可避免的会重启进程, 一重启这个定时器就没了, 应该有啥解决办法的吧, 不然这个函数 作用就不太高了
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
定时器的话 推荐用 github.com/robfig/cron 应该可以满足你的需求。
认可 @xiaowei520 的思路。
首先,time.AfterFunc 只是个简单的函数,多长时间执行某个动作这个设定只对当前进程有效,如果异常退出,需要一些恢复机制恢复。而关于如何恢复,这应该是程序员考虑的问题。
为实现恢复,肯定需要将保留现场。可行的方案就是把任务配置到外部存储中,保存任务信息,比如任务标识,执行时间,执行任务类型,状态等等。存储到哪里呢?可以是 xiaowei520 说的 redis,或者 MySQL 也行,当然,如果你有精力的话,也可以自己设计个文件结构来保存任务信息。
这种方式的缺点是,如果任务数比较多,一次加载进来会有性能影响,需要考虑负载均衡。而且,任务都加载在一个进程中容灾能力也不是很好,因为只有一个运行中的程序在处理任务,挂了就不行了。
对于上面说的问题,可以尝试引入一些外部服务,比如带有定时功能的 MQ。这样的话,容错的事情就交给 MQ 实现了。通常很多 MQ 组件都是高可用的,可以配置集群。然后,只要向队列上添加多个 consumer,即可实现负载均衡的效果,如果其中某台机器挂了,还有其他的 consumer 在运行,实现容灾能力。
我在网上找到了 RabbitMQ 实现定时消息的文章,如果有需要,可以看看能否参考一下。[Rabbitmq延迟队列实现定时任务](https://blog.csdn.net/wantnru...)
可以使用https://github.com/DanPlayer/...来解决这个问题