Se você quiser esse comportamento, evite criar objetos hit-for-pass quando receber 500 respostas do back-end .
Vamos supor que (1) você esteja sempre solicitando o mesmo URL / objeto em cache X; e (2) o objeto X está atualmente armazenado no armazenamento do verniz com um TTL de 1h e uma cortesia de 24h. Vamos agora assumir a seguinte linha do tempo:
- t = 0: algumas solicitações do cliente X para Varnish. O objeto já está em cache e está fresco, então o Varnish o retorna ao cliente. Não há solicitações de back-end.
- t = 1: o back-end é quebrado e responde a partir de agora com 500 solicitações.
- t = 3601: algumas solicitações do cliente X para verniz. O objeto é armazenado em cache, mas parado, então Varnish o retorna ao cliente e aciona uma solicitação de back-end em segundo plano para atualizar o objeto em cache X.
- t = 3602: a solicitação de back-end em segundo plano recebe uma resposta 500. Um objeto hit-for-pass é armazenado com um TTL de 120s. Este objeto sobrescreve o objeto parado X.
- t = 3603: alguns pedidos do cliente X para verniz. Um objeto hit-for-pass é encontrado e uma solicitação de back-end é executada. Uma resposta 500 é enviada para o lado do cliente.
- t = 4000: alguns pedidos do cliente X para verniz. O objeto X não está mais em cache e o backend foi marcado como doente há algum tempo. Uma resposta 503 será enviada para o lado do cliente: O verniz não pode entrar em contato com o back-end (está marcado como doente) e o Varnish não pode retornar o conteúdo da cortesia (foi substituído pelo objeto hit-for-pass em t = 3602).
A solução aqui seria evitar criar objetos hit-for-pass quando você receber 500 respostas do back-end. Em vez disso, simplesmente abandone a solicitação. Dessa forma, em t = 3603 e t = 4000, você enviará uma cópia paralisada do objeto para o lado do cliente.