延时任务¶
YTask并不能保证任务准时执行, 当你发现大量的延时任务到执行时间却没执行时,可尝试调大本地队列(v2.4+支持),调大YTask的任务并发数,或者部署更多的server端
开启延时任务¶
目前有两种方法开启延时任务:
运行server时,把enableDelayServer设为true
ser := ytask.Server.NewServer(...)
ser.Run("group", 10, true)
通过config配置 (v2.4+)
config:=config.NewConfig(
config.EnableDelayServer(true),
config.delayServerQueueSize(50), // 本地队列大小
)
提交延时任务¶
RunAfter
client.SetTaskCtl(client.RunAfter, 1*time.Second).Send("group2", "add_sub", 123, 44)
RunAt
runTime := time.Now().Add(1 * time.Second)
client.SetTaskCtl(client.RunAt, runTime).Send("group2", "add_sub", 123, 44)
延时任务执行流程¶
首选说明两个概念:inlineServer
:运行任务的server; delayServer
: 获取延时任务的server。
提交延时任务时YTask会在把任务提交到一个延时任务队列中(下面成为远程队列)。
2. delayServer会从远程队列中获取任务到本地队列并排序, 插入本地队列时,若本地队列已满,则会把离执行时间最远的任务出队,并重新插入远程队列的队尾。
delayServer定时取出本地队列中到执行时间的任务,并提交给inlineServer执行。也就是说延时任务与非延时任务公用一组并发的worker。
但服务关闭时delayServer会把本地队列中的任务插入远程队列中(默认插到队头,如果broker不支持会插到队尾)