#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 будут обновлены в таймере.