① 应用场景
++++++++++++'业务场景1'++++++++++++
1) 终端将'body信息'传递到服务端,'server'需要立马对终端'作出响应'
eg: 返回'200'的状态码、'关闭'终端连接
2) 但是'服务器内部'需要'5/10s'给终端传输数据
原因:
1、定时器一旦创建,就会'脱离当前请求'
2、'也就是说'就算当前请求结束了,定时器还是在的,它的'生命周期'跟创建它的 'worker 进程'一样
++++++++++++'业务场景2'++++++++++++
1) 在服务器的'时间列表'中去跑一个'后台异步任务'
2) 定时向'上游服务器'发送一些信息
++++++++++++'业务场景3'++++++++++++
重点: 某个'worker'异步执行任务定时从'redis'拉取策略信息
说明: 跟'init_worker_by_lua'结合使用
语法'syntax': ok,err = ngx.timer.at(delay, callback, arg1, arg2,...)
特点: 创建定时器,'到期'时会'回调' callback 函数
ngx.timer.at的'参数':
1、delay表示'延迟的时间(指定到期时间)',以's'秒为单位
备注:也可以使用'小数','精度0.001(1ms)';也可以指定0-->会'立马过期并执行回调函数'
2、callback表示'延迟后'执行的函数-->'回调函数'-->函数名
3、arg1,arg2...是'可变长'参数,作为'回调函数'的入参
+++++++'辅助参数'+++++++
1、callback回调函数'第一个参数是premature',它是一个'固定的参数'
含义: '判断nginx实例是否正在退出'
作用: 在‘指定的延迟时间(delay)‘后,执行callback这个函数
特点: premature是个'布尔值',代表是否是'正常回调'
1) premature '为真'的情况 -->比如,nginx 准备'关闭'或者'reload'
细节: 在入参中加入premature会'让nginx内核自动调用'
场景:
1) 当Nginx工作进程正在'尝试关闭'时,会发生'提前定时器到期'
如:在nginx配置中由'HUP信号'触发的'重新加载'或nginx服务器'关闭'
+++++++++'生命周期'+++++++++
1、当定时器到期,回调函数'以协程的方式'运行,完全'脱离'创建该定时器的环境
2、对象生命周期跟创建它的'worker进程一样',跟 cosockets 一样
特点: '不能'在原始环境和定时器回调函数里'共享'
3、类似'Unix'的'at命令',执行一次就'over'了
+++++++++'多worker时,让指定worker执行timer,防止重复执行'+++++++++
if ngx.worker.id() == 1 then
local ok,err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer:", err)
end
end
案例1: 简单'案例'
案例2: 用'at'模拟循环调用
例如: 每'5s触发一次','不推荐'这样用-->应该用 'ngx.timer.every' 函数
+++++++++'官方demo'+++++++++
-- 核心: function里面嵌套'timer'
local delay = 5
local handler
handler = function (premature)
-- 每5秒执行一次
if premature then
return
end
local ok, err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
end
local ok, err = ngx.timer.at(delay, handler)
if not ok then
ngx.log(ngx.ERR, "failed to create the timer: ", err)
return
end
③ 定时器运行和等待的数量
1、定时器相关'API'
ngx.timer.running_count ngx.timer.pending_count
pending'等待': delay时间'还没有'到,callback'还没有'被触发的'定时任务数量'
2、定时器相关'指令'
+++++++++这两个指令决定了'定时器'最大'运行'数量和'等待'数量+++++++++
1) lua_max_running_timers
指定'最大运行'的定时器'数量'(默认值为256)
2) lua_max_pending_timers
指定'最大等待'运行的定时器的数量(默认值为1024)
+++++++'知识补充'+++++++
1、nginx是一个以'连接'为资源管理单位的应用
2、reload如何这个'连接'不释放,占用'内存等资源'是不会被释放
说明: 理解同'crontab',使用参见'ngx.timer.at'即可
③ 相关参考