golang+数据库定时任务
项目背景大致如下,楼主在用nodejs写项目时遇到一些需要定时去处理的事情,例如僵尸用户定时清除,一些产品定时下架,邮件定时发送等等! 期初使用nodejs setTimeOut递归嵌套实现,后来发现内存不断飙升,故而放弃,最终改用了性能不错的golang实现
数据库设计
字段名称
含义
id
编号
name
任务名称
create_at
创建时间
type
1. 执行一次 2.循环执行
separate_time
执行间隔
status
执行状态 0.未开始 1. 执行中 -1.执行失败 -2.手动暂停
remark
备注信息
fn
要执行的数据库存储过程或函数
start_time
开始执行时间
next_exec_time
下次执行时间
last_exec_time
上次执行时间
fn_type
email, sql 等等
大致实现流程
需要有一个死循环,sleep 10s启动然后sleep 10 ...
for {
time.Sleep(10 * time.Second)
go execTask(*db) //使用子进程执行,防止卡死主进程
}
开始执行,查找需要执行的任务
rows, err := db.Query("SELECT id,name,status,type,fn,fn_type, separate_time FROM public.tasks where (status = 0 and start_time < now()) or (status = 1 and next_exec_time < now());")
执行任务
res, err := db.Exec(fn)
执行任务成功后,更新下次执行时间
func setTaskNextExecTime(db sql.DB, taskId string, separateTime int64) error {
next_exec_tim