2

我需要在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脚本中设置这些值,这些值将在每个 minite 中调用。仅供参考,它将转到Redis然后检索必要的数据,并更新此变量。我知道我可以content_by_lua在每次通话中都这样做,但是对于大量流量来说效率非常低。

我想要一个单独的进程,每分钟左右触发一次,只执行一项任务。有没有这样的东西,nginx或者有没有可以帮助我的模块?

4

2 回答 2

7

你可以使用 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-27T21:49:29.280 回答
1

您可以使用ngx.timer.every API。建议使用ngx.timer.every API 而不是使用递归ngx.timer.at API。

于 2019-11-12T20:46:38.380 回答