Openresty Lua: не удается подключиться к redis после получения ответа от api-сервера

#redis #lua #openresty

#redis #lua #openresty

Вопрос:

Я создаю ограничитель вызовов на основе ключа api и сохраняю счетчик вызовов в redis, где ключ — это мой api-ключ, а значение — счетчик. После достижения порогового значения или разрешенного вызова для этого ключа я выдаю сообщение о достижении вашей квоты или что-то в этом роде.Он работает нормально, и ответ также быстрый, но проблема в том, что я не могу получить доступ к статусу ответа api-сервера, поэтому, даже если ответ равен 500, счетчик вызовов увеличивается. Теперь, что мне нужно сделать, это увеличить счетчик, только если я получу код состояния 2.x.x , но я могу получить ответ только ngx.status в body_filter_by_lua_file , но в этой директиве я не могу установить соединение с redis или postgres. Он выдает failed to run body_filter_by_lua*: attempt to yield across C-call boundary ошибку, однако я могу подключиться к redis, content_by_lua_file но не могу получить доступ к статусу ответа. Надеюсь, я прояснил.

PS: я использую последнюю версию openresty и lua-resty-redis

Ответ №1:

Один из способов, который я могу предложить, — переместить код, который подключается к Redis. к отдельной функции и запланируйте эту функцию с помощью ngx.timer.at .

Это работает для меня, но с одним недостатком по сравнению с использованием ngx.shared.DICT. Конечно, следующий запрос может поступить до того, как данные Redis будут обновлены в таймере.