如何在nginx内部创建异步“类cron”的调度程序

我需要在 nginx 服务器内创建一个异步调度程序来更新变量。让我举一个例子来说明我是什么意思以及为什么需要它。

想象一个类似于以下内容的配置文件:

http {
    lua_shared_dict foo 5m;
    server {
        location /set {
            content_by_lua '
                local foo = ngx.shared.foo
                ngx.say(foo:get("12345"))
            ';
        }
    }
}

我指定了一个存在于共享内存中的变量 foo,所有工作进程都可以访问它。我想做的是从一个 lua 脚本中设置这些值,该脚本将每分钟调用一次。仅供参考,它将会访问 Redis,然后检索必要的数据,并更新此变量。我知道我可以在每次调用时在 content_by_lua 中执行此操作,但对于大量的流量来说效率极低。

我想要一个单独的进程,该进程每分钟或更长时间就会被触发一次,从而只执行一个任务。在 nginx 中是否有类似的东西,或者是否有任何模块可以帮助我完成这项任务?

点赞
用户2789404
用户2789404

你可以使用ngx_lua提供的新ngx.timer API。有关详细信息,请参阅文档:

https://www.nginx.com/resources/wiki/modules/lua/#ngx-timer-at

您可以在计时器处理程序中创建一个新的计时器,以使计时器保持像cronjob一样触发。

顺便说一下,计时器是每个工作进程的,您可以在计时器处理程序中使用lua-resty-lock库,以确保在所有nginx工作进程中仅有一个计时器处于活动状态:https://github.com/agentzh/lua-resty-lock

2013-09-27 21:49:29
用户774674
用户774674

你可以使用 ngx.timer.every API。推荐使用 ngx.timer.every API 而不是使用递归的 ngx.timer.at API。

2019-11-12 20:46:38