Inicio
A biblioteca Caffeine é uma reescrita do cache do goiaba que usa uma API inspirada no goiaba que retorna CompletableFutures, permitindo o carregamento automático assíncrono de entradas no cache. No qual o cache do Guava se baseia.
Goiaba
- A goiaba é bloqueada durante o carregamento quando uma chave não está presente no cache.
Queríamos alterar a API para funcionar de forma assíncrona, mas a complexidade adicionada dificultava o entendimento e a solução de problemas do código.
Para tornar o Guava sem bloqueio, substituímos os métodos load e loadAll do CacheLoader para fazer com que a API retorne um futuro. - Como alteramos a API para retornar um futuro, encontramos um problema. A goiaba não sabe que a usamos para armazenar futuros, portanto, armazena futuros concluídos com uma exceção também. Para impedir que as exceções sejam armazenadas no cache, precisamos adicionar mais complexidade ao nosso código.
Cafeína IN
- A cafeína é uma reescrita do cache do Guava que usa uma API que retorna CompletableFutures fora da caixa, permitindo o carregamento automático assíncrono de entradas no cache.
- A cafeína remove futuros que são concluídos com uma exceção do cache.
- A cafeína usa uma política de despejo de Menos Utilizados Recentemente (LRU) e uma política de admissão baseada em frequência, com base no esboço CountMin. Tem uma taxa de acerto melhor que a LRU para muitas cargas de trabalho.
Referência da taxa de acerto de Goiaba vs Caffeina
Analisamos o comportamento do serviço com tráfego real sob diferentes configurações de cache para ter uma idéia de como os serviços de produção se comportarão.
O cache aferido contém URLs de imagem codificadas pelo UUID e segue um padrão de acesso dos dados mais frequentes / menos frequentes, que é o nosso caso de uso mais comum no Avance.
Nos benchmarks abaixo, não medimos e, portanto, não temos interpretação do uso de memória. Mas analisar as taxas de acerto leva a algumas idéias interessantes.
1. Tamanho do cache: 10 mil itens
Expiração após gravação: 5 min
Taxa de acertos com 10 mil itens:
Cafeína 28,33%
Goiaba 20,95%
2. Tamanho do cache: 50k itens
Expiração após gravação: 20 min
Taxa de acertos com 50 mil itens:
Cafeína 56,04%
Goiaba 50,01%
3. Tamanho do cache: 100 mil itens
Expiração após gravação: 20 min
Taxa de acertos com 100 mil itens:
Cafeína 70.10%
Goiaba 66.77%
4. Tamanho do cache: 300k itens
Expiração após gravação: 20 min
Taxa de acertos com 300 mil itens:
Cafeína 87,19%
Goiaba 84,85%
Conclusão
Conseguimos! Com pequenas alterações no código de infraestrutura (como as APIs Caffeine e Guava são quase idênticas), aprimoramos nossa taxa de acertos e reduzimos a complexidade do código para serviços críticos em nosso sistema.
Honestamente, a cafeína e melhor que a goiaba!