如何只启动一个 timer 工作?

    整个 OpenResty 启动后,我们有时候需要后台处理某些动作,比如数据定期清理、同步数据等。而这个后台任务实例我们期望是唯一并且安全,这里的安全指的是所有 Nginx worker 任意 crash 任何一个,有机制合理保证后续 timer 依然可以正常工作。

    解决办法

    剩下的问题就比较简单了,完全可以把我们的 timer 绑定到某个特定的 worker 上即可。
    下面的例子,演示如何只在 worker.id 为 0 的进程上运行后台 timer。

    1. local delay = 3 -- in seconds
    2. local new_timer = ngx.timer.at
    3. local log = ngx.log
    4. local ERR = ngx.ERR
    5. local check
    6. check = function(premature)
    7. -- do the health check or other routine work
    8. local ok, err = new_timer(delay, check)
    9. if not ok then
    10. log(ERR, "failed to create timer: ", err)
    11. return
    12. end
    13. end
    14. if 0 == ngx.worker.id() then
    15. local ok, err = new_timer(delay, check)
    16. if not ok then
    17. log(ERR, "failed to create timer: ", err)
    18. return
    19. end
    20. }