1. 程式人生 > >lua併發限流程式碼

lua併發限流程式碼

首先在nginx.conf 檔案中的http節點新增:

lua_shared_dict limit_req_store 10m;

以下是lua併發限流程式碼:

local limit_req = require "resty.limit.req"

--限制請求速率為500 req/sec
local lim,err = limit_req.new("limit_req_store",5,0)
if not lim then --申請limit_req物件失敗
ngx.log(ngx.ERR,"failed to instantiate a resty.limit.req object: ",err)
return ngx.exit(500)
end

-- 下面程式碼針對每一個單獨的請求
-- 使用ip地址作為限流的key
local key = ngx.var.binary_remote_addr
local delay,err = lim:incoming(key,true)
if not delay then
if err == "rejected" then
return ngx.exit(503)
end
ngx.log(ngx.ERR,"failed to limit req: ",err)
return ngx.exit(500)
end


if delay > 0 then
--第二引數(err)儲存著超過請求速率的請求數
--例如err等於31,意味著當前速率是 531 req/sec
local excess = err

---- 當前請求超過200 req/sec 但小於 300 req/sec
-- 因此我們sleep一下,保證速率是200 req/sec,請求延遲處理
ngx.sleep(delay) --非阻塞sleep(秒)
end
ngx.say("you success!!!")