.... local cache_str = string.format([[%s&%s&%s&%s&%s&%s&%s]], net, name, ip, mac, ngx.var.remote_addr, method, md5) local ok, err = ngx_nf_data:safe_set(mac, cache_str, 60*60) --这些是缓存数据 if not ok then ngx.log(ngx.ERR, "stored nf report data error: "..err) end ....
while not ngx.worker.exiting() do local keys = ngx_share:get_keys(50) -- 一秒处理50个数据
for index, key in pairs(keys) do str = ((nil ~= str) and str..[[#]]..ngx_share:get(key)) or ngx_share:get(key) ngx_share:delete(key) --干掉这个key end .... --一些消费过程,看官不要在意 ngx.sleep(1) end
在上述业务逻辑下会出现由生产者生产的某些 key-val 对永远不会被消费者取出并消费,原因就是 shared.DICT 不是队列,ngx_shared:get_keys(n) 函数不能保证返回的 n 个键值对是满足 FIFO 规则的,从而导致问题发生。