Openresty不同worker进程间数据共享

988次阅读
没有评论

共计 2296 个字符,预计需要花费 6 分钟才能阅读完成。

Openresty不同worker进程间数据共享

上一篇博主介绍了通过module把共享数据限制在各自worker进程间,此处就讲下不同worker进程的数据如何共享

根据官方的说法,若是要在服务器范围内,即不同worker工作进程间进行数据通信,可以使用以下方式:

  1. 使用此模块提供的ngx.shared.DICT API。
  2. 仅使用单个 Nginx worker 和单个服务器(但是,当有多核 CPU 或单机中有多个 CPU 时,不建议这样做)。
  3. 使用 、 或 等memcached数据存储redis机制。OpenResty 官方版本附带了一组配套的 Nginx 模块和 Lua 库,它们提供了与这些数据存储机制的接口。MySQL / PostgreSQL

此篇我们就记录第一种方式,第二种略,第三种我还不会emmmmm

ngx.shared.DICT

使用方式

syntax: dict = ngx.shared.DICT

syntax: dict = ngx.shared[name_var]

context: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*, balancer_by_lua*, ssl_certificate_by_lua*, ssl_session_fetch_by_lua*, ssl_session_store_by_lua*, exit_worker_by_lua*, ssl_client_hello_by_lua*

使用该方式要用到另外一个方法:lua_shared_dict

syntax: lua_shared_dict <name> <size>

default: no

context: http

phase: depends on usage

该方法是用来定义一块共享内存空间,所有worker都可以使用,定义共享内存空间样例:


 http {
     lua_shared_dict api_counter 1m;
     ...
 }

上面已经定义了一块共享内存空间,接下来使用ngx.share.DICT内的方法来操作这块空间

使用set方法设置key/value,使用get取除key/value

    location /api/sayHi {
        content_by_lua_block {
            ngx.say('Hi xadocker!')
            --- 调用子请求
            local res = ngx.location.capture("/counter")
            ngx.log(ngx.INFO,res.status,res.body)
        }
    }

    location /counter {
        # 配置为仅内部访问
        internal;
        content_by_lua_block {
            local api_counter = ngx.shared.api_counter
            local num,flag =api_counter:get("sum")
            if nil == num then
                api_counter:set("sum",1)
            else
                api_counter:set("sum",num+1)
            end
            ngx.say("STORED OK")
        }
    }

    location /getCounter {
        content_by_lua_block {
            local api_counter = ngx.shared.api_counter
            ngx.say(api_counter:get("sum"))
        }
    }

测试运行

[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/api/sayHi
Hi xadocker!

# 内部接口,无法外部访问
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/counter
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.17.8.2</center>
</body>
</html>

# 获取/api/sayHi接口统计次数
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
3

# reload也不会释放该shared空间,只有重启openresty
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
403
[root@nginx-cluster conf.d]# openresty -s reload
[root@nginx-cluster conf.d]# curl 127.0.0.1:8084/getCounter
403

nginx.shared.DICT的方法有很多,有兴趣的读者可以参考下:

正文完
 
xadocker
版权声明:本站原创文章,由 xadocker 2021-07-16发表,共计2296字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)