Proteção Contra Cache Stampede no Symfony 4.2

Andréia Bohner
2 min readNov 25, 2018

--

Cache stampede é um tipo de falha em cascata que pode ocorrer quando os sistemas estão sob carga muito alta. Considere uma aplicação web que armazena em cache alguma página para melhorar o desempenho. Quando a versão em cache dessa página expira e o servidor está sob carga muito pesada, vários usuários podem estar solicitando a mesma página não armazenada em cache, o que poderia levar ao colapso do sistema devido aos recursos compartilhados esgotados.

Existem várias técnicas para proteger contra “cache stampede”. No Symfony 4.2, foi adicionada uma chamada expiração antecipada probabilística (probabilistic early expiration), ao componente Cache (também foi adicionada uma baseada em bloqueio para quando o cache está frio).

Essa técnica resolve o problema de stampede forçando a regeneração dos valores em cache antes que eles expirem. Sempre que um valor é lido do cache, a aplicação faz uma “decisão probabilística” para decidir se o valor deve ser regenerado ou não. Graças à fórmula usada, quanto mais cedo a expiração do valor em cache, maior a probabilidade de recomputá-lo.

Para fornecer melhor controle a essa “decisão probabilística”, o método get() da CacheInterface adicionou um terceiro argumento opcional chamado beta. É um valor float que é padronizado para 1.0, que fornece proteção ideal contra stampedes.

Na maioria das vezes você não precisa se preocupar com esse parâmetro. O Symfony fornece o valor padrão certo para proteger suas aplicações. No entanto, você pode configurá-lo para:

  • um valor arbitrário;
  • 0 para desabilitar essa proteção;
  • ou INF para forçar uma expiração imediata do valor em cache:
// this closure will be called when a cache key is missing from the backend
$callback = function () { ... return $computedValue; };

// when undefined, beta = 1.0
$productsCount = $cache->get('stats.products_count', $callback);

// beta = INF to force the immediate expiration of this cached value
$productsCount = $cache->get('stats.products_count', $callback, INF);

Tradução de: New in Symfony 4.2: Cache stampede protection

--

--