Удаление ключа в кэше Nginx и базе данных Backend в одном запросе

Я использую Nginx с открытым исходным кодом в качестве веб-сервера с Proxy_cache.

У меня есть уникальный вариант использования: удаление ключа из кеша, а также передача запроса внутренним серверам на удаление ключа в БД без кэширования ответ.

Удалите ключ в кэше веб-сервера и в серверной БД в одном запросе.
Клиент => балансировщик нагрузки => Nginx (proxy_cache) => приложение => PostgreSQL

например, Nginx.conf

if ( $http_x_delete_key ){
  content_by_lua_file ./purge_key.lua;
  proxy_pass          http://backend_servers; 
}

например, purge_key.lua

...
if ngx ~= nil then
    ...
    delete_file(filename)
    ngx.log(ngx.NOTICE, 'deleted')
    -- ngx.exit(ngx.OK);
    -- return
end

Блок 'if' в разделе местоположения Nginx просто останавливает поток ( Как работает nginx "location if" ) и возвращает ответ, не отправляя его на бэкэнд, и не передает запрос как есть.
Я даже скомпилировал OpenResty с помощью бесплатного модуля 'ngx_cache_purge', но команда очистки также не передает запрос на бэкэнд.

Обычно вы тайм-аут или обновляете ключ, используя ответ бэкэнда, но в моем случае мне нужен более явный контроль чтобы удалить ключ либо в том же запросе, либо в ответе.

Решает ли этот вариант использования Openresty + Memcache, Apache httpd, Apache Traffic Server или Varnish (vcl_purge и pass) или есть другой способ сделать это?

2
задан 23 May 2018 в 01:33
2 ответа

Я как бы нашел способ сделать это.

В зависимости от значения заголовка HTTP-запроса запустите lua-скрипт, чтобы удалить файл кеша (хэш ключа и его последние символы x + y, если уровень кэша x: y) в proxy_cache Nginx.

Использование «access_by_lua» вместо «content_by_lua» в качестве фазы обработчика содержимого всегда будет завершаться и возвращаться, даже если я не напишу «ngx.exit» или «ngx.OK».

Мне нужно запустить lua-скрипт в NGX_HTTP_ACCESS_PHASE , а не в NGX_HTTP_CONTENT_PHASE , так как я не генерирую контент или ответ, который должен исходить от серверной части в моем сценарии.

например, Nginx.conf

proxy_cache_bypass     $http_x_delete_key;
proxy_no_cache         $http_x_delete_key;

if ( $http_x_delete_key ){
  ...
  access_by_lua_file ./purge_key.lua;
}

Когда приходит запрос на удаление ключа, Nginx будет
1. Запустите сценарий lua, чтобы удалить файл кеша, но не возвращайтесь немедленно, так как он находится в фазе доступа
2. Запрос будет обходить кеш
3. При получении запроса приложение удалит ключ в БД
. 4. Ответ не будет кешироваться в Nginx proxy_cache

1
ответ дан 3 December 2019 в 12:32

Общий подход состоит в том, чтобы приложение выполняло как удаление из кеша, так и из базы данных. В качестве альтернативы, lua, размещенный на nginx, может делать и то, и другое.

Вообще говоря, любой многоступенчатый / многоэтапный вид обработки запросов является уровнем приложения, а не уровнем веб-сервера / сети. Никакой прокси-сервер, управляемый конфигурацией, не должен стремиться к решению этой проблемы.

Так что сделайте это как часть вашего приложения и решите, будет ли правильный след в исходной кодовой базе или в lua. Скорее всего, лучшее место - это исходная кодовая база.

0
ответ дан 3 December 2019 в 12:32

Теги

Похожие вопросы