Excluindo a chave no cache Nginx e no banco de dados back-end na mesma solicitação

2

Estou usando o Nginx de código-fonte aberto como o servidor da Web com Proxy_cache.

Eu tenho um usecase exclusivo de excluir a chave no cache, bem como passar a solicitação para os servidores de back-end para excluir a chave no banco de dados sem armazenar em cache a resposta.

Portanto, exclua a chave no cache do servidor Web e no DB de back-end na mesma solicitação.
Cliente = > balanceador de carga = > Nginx (proxy_cache) = > aplicação = > PostgreSQL

por exemplo, Nginx.conf

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

por exemplo, purge_key.lua

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

O bloco 'if' na seção de localização do Nginx interrompe o fluxo ( Como nginx "location if" funciona ) e retorna a resposta sem enviá-la ao back-end e não está passando a solicitação como está.
Eu inclusive compilei o OpenResty usando o módulo 'ngx_cache_purge' livre, mas o comando purge também não passou o pedido para o backend.

Geralmente você tem tempo limite ou atualiza a chave usando a resposta de back-end, mas no meu caso eu preciso de um controle mais explícito para excluir a chave na mesma solicitação ou na sua resposta.

O Openresty + Memcache, o Apache httpd, o Apache Traffic Server ou o Varnish (vcl_purge e pass) resolvem este uso ou há alguma outra maneira de fazer isso?

    
por dv3 22.05.2018 / 20:44

2 respostas

1

Eu meio que encontrei uma maneira de fazer isso.

Dependendo do valor do cabeçalho da solicitação de HTTP, execute um script de lua para excluir o arquivo de cache (hash da chave e seus últimos caracteres x + y, se x: y nível do cache) no proxy_cache do Nginx.

Usando 'access_by_lua' em vez de 'content_by_lua', a fase do manipulador de conteúdo sempre sairá e retornará, mesmo que eu não escreva 'ngx.exit' ou 'ngx.OK'.

Eu tenho que executar o script lua no NGX_HTTP_ACCESS_PHASE e não no NGX_HTTP_CONTENT_PHASE , pois não estou gerando conteúdo ou resposta que deve vir do backend no meu cenário.

por exemplo, 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;
}

Quando a solicitação da chave de exclusão é exibida, o Nginx vai 1. Execute o script lua para excluir o arquivo de cache, mas não retornar imediatamente, pois ele está na fase de acesso. 2. Pedido irá ignorar a cache
3. Ao receber a solicitação, o aplicativo excluirá a chave no DB. 4. A resposta não será armazenada em cache no Nginx proxy_cache

    
por 23.05.2018 / 20:16
0

A abordagem comum é fazer com que o aplicativo exclua do cache e do banco de dados. Como alternativa, faça com que a lua hospedada no nginx faça as duas coisas.

Em geral, qualquer tipo de processamento de solicitação multiestágio / multi-upstream é de nível de aplicativo, não de servidor da Web / de rede. Nenhum servidor proxy orientado por configuração deve ser inclinado na forma de resolver esse problema.

Portanto, faça isso como parte de seu aplicativo e decida se a pegada correta está na base de código upstream ou em lua. Muito provavelmente, o melhor lugar é a base de código upstream.

    
por 23.05.2018 / 04:13