• jackstraw
    2019-12-20
    老师,这里的限流都是针对一台NGINX的,我们的业务是N台NGINX同时提供服务的,这种情况下可以怎么做限流啊?
    
     1
  • wusiration
    2019-09-02
    老师,限制器的组合小节里面的代码,limit_req重复了,应该有一个limit_count。
    课后习题:
    local limit_rate = require "resty.limit.rate"
    local limit_count = require "resty.limit.count"
    local limit_conn = require "resty.limit.conn"

    local lim_rate, err = limit_rate.new("my_rate_store", 100, 6000, 2) -- 将resty.limit.req替换成resty.limit.rate即可
    local lim_count, err = limit_count.new("my_count_store", 200, 100)
    local lim_conn, err = limit_conn.new("my_conn_store", 1000, 1000, 0.5)

    local limiters = {lim_rate, lim_count, lim_conn}
    local host = ngx.var.host
    local client = ngx.var.binary_remote_addr
    local keys = {host, client, client}

    local delay, err = limit_traffic.combine(limiters, keys, states)
    展开

    作者回复: 多谢指正,看的真仔细👍

    
     1
  • 文艺败类
    2019-11-10
    老师,我想要将限速限流参数放置在memcached中,每次请求时通过读取相关的配置来达到动态配置限流限速的功能(代码如下),当我扩大memcached中limit_num值后,发现返回的剩余的调用次数(remaining)并未发生变化,其中原理并不清楚,期望老师解惑或者提供更好的动态修改限流配置的方向

    local memcached = require "resty.memcached"
    local memc, err = memcached:new()
    memc:set_timeout(1000)
    local ok, err = memc:connect("127.0.0.1", 11211)
    local limit_num, flags, err = memc:get("limit_num")
    local limit_time, flags, err = memc:get("limit_time")

    local limit_count = require "resty.limit.count"
    local lim, err = limit_count.new("global_count_limit", tonumber(limit_num), tonumber(limit_time))
    local delay, remaining = lim:incoming('global', true)
    if not delay then
        return ngx.exit(503)
    end
    ngx.say(remaining)
    展开
     1
    
  • Sir
    2019-09-18
    老师好,我把这段代码也在location中,是不是相当于我每次请求都new了一次,比较迷惑
    local lim, err = limit_req.new("my_limit_req_store", 200, 100)

    作者回复: 这种对象的 new 一般都是放在 module 的 top level 中,避免重复创建

    
    
  • FF
    2019-09-03
    请教个问题。如果把 lua 模块用 lua_by_* 的方式引入 ngx 的 location 指令块里面,那每次请求,都会执行一遍 lua 模块中的 top level 变量和那些不是定义在函数中的全局代码块吗 ?

     
    我测了一下好像每次请求都执行一遍 ?那全局变量不是每次请求都要初始化一次啊 ?这样的话如果想在函数执行的上下文中再将一些数据保存到全局变量里面,那不是没办法用全局变量实现了 ?


    盼温老师解惑。
    展开

    作者回复: 如果你要使用全局变量, 可以写到 init 阶段,这样就只会执行一遍了。但是全局变量是不推荐使用的,在最新的OpenResty 1.15.8 版本中,增加了全局变量的检测,如果发现就会打印一条 warn 级别的日志。
    如果你希望保持函数上下文的全局数据,可以试试模块的 top level 变量。
    同时,在你测试的时候,记得保持 lua_code_cache on,并且不要在 Windows 下测试。

    
    
  • 许童童
    2019-09-02
    跟着老师一起精进。
    
    
我们在线,来聊聊吧