Openresty(十一)定时器

一  ngx.timer

openresty的几种异步调用方法

①  应用场景

++++++++++++'业务场景1'++++++++++++

1) 终端将'body信息'传递到服务端,'server'需要立马对终端'作出响应'

eg: 返回'200'的状态码、'关闭'终端连接

2) 但是'服务器内部'需要'5/10s'给终端传输数据

原因: 

 1、定时器一旦创建,就会'脱离当前请求'

 2、'也就是说'就算当前请求结束了,定时器还是在的,它的'生命周期'跟创建它的 'worker 进程'一样

++++++++++++'业务场景2'++++++++++++

1) 在服务器的'时间列表'中去跑一个'后台异步任务'

2) 定时向'上游服务器'发送一些信息

++++++++++++'业务场景3'++++++++++++

重点: 某个'worker'异步执行任务定时从'redis'拉取策略信息

说明: 跟'init_worker_by_lua'结合使用

timer的场景   其它参考

②  ngx.timer.at

timer.at和internal配合 

语法'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

premature的场景 

案例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如何这个'连接'不释放,占用'内存等资源'是不会被释放

④  ngx.timer.every

说明: 理解同'crontab',使用参见'ngx.timer.at'即可

参考博客

其它参考

③  相关参考

参考博客1

参考博客2

浅谈ngx.exit,ngx.eof,ngx.timer.at

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值