Openresty Lua : 无法连接redis,在接收到api-server响应后

我正在基于api密钥制作调用限制器,并在redis中保留调用计数器,其中密钥是我的api密钥,值是计数器。达到阈值或允许使用该密钥的调用数后,我会抛出一条消息,说明您的配额已用尽或其他类似的内容。它能正常工作,响应也很快,但问题是我无法访问api-server的响应状态,因此即使响应是500,调用计数器也会增加。 现在,我需要做的是仅在获得状态码2.x.x时增加计数器,但我只能在body_filter_by_lua_file中捕获响应ngx.status,但在该指令中无法连接到redis或postgres。它会抛出一个failed to run body_filter_by_lua*: attempt to yield across C-call boundary错误,然而我可以在content_by_lua_file中连接到redis,但无法访问响应状态。希望我表述清楚了。

PS:我正在使用最新的openresty和lua-resty-redis。

点赞
用户2753168
用户2753168

我可以提供一个解决方法,即将连接到 Redis 的代码移动到一个单独的函数中,并使用 ngx.timer.at 调度此函数。

对我来说它有效,但相比使用 ngx.shared.DICT 有一个缺点。当然,下一个请求可能会在计时器中更新 Redis 数据之前到达。

2022-11-07 13:21:34