Melhorando o desempenho do cache Redis em ambientes de larga escala
(meetup.toast.com)Redis é um banco de dados em memória amplamente usado para cache em serviços online. No entanto, se for usado de forma incorreta, podem surgir problemas inesperados ou até mesmo grandes incidentes. Recentemente fui a uma livraria e, por acaso, encontrei um engenheiro em atividade que trabalha na equipe de SRE de uma empresa. Durante a conversa, ele chegou a dizer: “Redis é, na verdade, um mal necessário. Deve ser usado já pensando que, em algum momento, um incidente relacionado vai acontecer pelo menos uma vez.”
Referência - Kakao "Se usar Redis errado, dá ruim":
https://zdnet.co.kr/view/?no=20131119174125
Referência - A causa do erro da Coupang foi o banco de dados open source 'Redis DB':
http://www.digitaltoday.co.kr/news/articleView.html?idxno=212904
Assim, Redis é algo que precisa ser bem compreendido e usado com cuidado.
A introdução ficou longa. Com base em uma apresentação da RedisConf 2020, a NHN apresenta um documento que aponta três pontos em que podem surgir problemas de desempenho ao usar Redis como cache em um ambiente de tráfego em larga escala, além de explicar como resolvê-los. (em coreano)
-
Cache Stampede: como o espaço de cache é limitado, normalmente define-se um tempo de expiração (TTL) para os dados armazenados. Porém, se requisições de leitura continuarem chegando para esses dados e o tempo de expiração do cache vencer, essas leituras se concentram momentaneamente no banco de dados, e isso volta a se acumular em requisições de escrita duplicadas no Redis. Isso é chamado de Cache Stampede, e como solução pode-se renovar o valor de TTL antecipadamente com um algoritmo baseado em distribuição de probabilidade, ou então introduzir o conceito de debounce (executar apenas o último evento entre vários eventos repetidos).
-
Hot Keys: o desempenho também pode cair quando as leituras se concentram em uma única chave. O texto apresenta como contramedida o método de criar várias réplicas adicionando um prefixo ao nome da chave e, depois, distribuir aleatoriamente as leituras entre essas réplicas com prefixo.
-
Compression: também pode haver degradação de desempenho ao armazenar dados grandes no Redis. Nesse caso, apenas aplicar uma compressão adequada já pode trazer grandes ganhos em velocidade e uso de memória. Como o método e a taxa de compressão ideais podem variar conforme a situação e o ambiente, ao aplicar isso é indispensável realizar testes de benchmark que reproduzam o ambiente de uso.
1 comentários
Referência - um texto com código de exemplo do algoritmo baseado em distribuição de probabilidade mencionado acima (Probablistic Early Recomputation):
https://engineering.linecorp.com/ko/blog/…