定时器函数如何避免程序重启造成的中断

time.AfterFunc 定时器函数如何避免程序重启造成的中断

地址:https://segmentfault.com/q/1010000020721814/a-1020000020725436

标签:Go

详情描述

time.AfterFunc 定时器如何避免程序重启造成的中断

线上不可避免的会重启进程, 一重启这个定时器就没了, 应该有啥解决办法的吧, 不然这个函数 作用就不太高了。

我的回答

认可 @xiaowei520 的思路。

首先,time.AfterFunc 只是个简单的函数,多长时间执行某个动作这个设定只对当前进程有效,如果异常退出,需要一些恢复机制恢复。而关于如何恢复,这应该是程序员考虑的问题。

为实现恢复,肯定需要将保留现场。可行的方案就是把任务配置到外部存储中,保存任务信息,比如任务标识,执行时间,执行任务类型,状态等等。存储到哪里呢?可以是 xiaowei520 说的 redis,或者 MySQL 也行,当然,如果你有精力的话,也可以自己设计个文件结构来保存任务信息。

这种方式的缺点是,如果任务数比较多,一次加载进来会有性能影响,需要考虑负载均衡。而且,任务都加载在一个进程中容灾能力也不是很好,因为只有一个运行中的程序在处理任务,挂了就不行了。

对于上面说的问题,可以尝试引入一些外部服务,比如带有定时功能的 MQ。这样的话,容错的事情就交给 MQ 实现了。通常很多 MQ 组件都是高可用的,可以配置集群。然后,只要向队列上添加多个 consumer,即可实现负载均衡的效果,如果其中某台机器挂了,还有其他的 consumer 在运行,实现容灾能力。

我在网上找到了 RabbitMQ 实现定时消息的文章,如果有需要,可以看看能否参考一下。[Rabbitmq延迟队列实现定时任务](https://blog.csdn.net/wantnrun/article/details/80401641)