O que é o Redis Pipelining?
É uma técnica para melhorar o desempenho que permite enviar vários comandos de uma só vez sem esperar pela resposta de cada comando individual.
Através dessa imagem é possível ver a diferença que o pipelining faz na execução:
Quando ele é útil?
O Pipeline é muito útil em situações em que há muitas operações de leitura/escrita no Redis. Ao usar um pipeline, é possível reduzir significativamente o custo de latência associado ao tempo de ida e volta, além disso, ele melhora muito o número de operações que você pode executar por segundo.
Outro uso interessante para o Pipeline, é para implementar transações atômicas, garantindo que um conjunto de operações seja executado como uma única unidade. Isso é possível porque o Redis Pipeline permite que os comandos sejam agrupados em uma transação que só será executada quando todos os comandos no pipeline forem enviados e retornarem com sucesso.
Caso de uso
No trabalho, passei por uma situação a qual precisava melhorar a performance de uma Lambda (Python) que consumia de uma fila SQS e em seguida realizava várias operações de leitura e escrita no REDIS.
PROBLEMA
Devido a quantidade de operações realizadas a cada mensagem recebida, algumas acabavam não sendo processadas devido o timeout de 30 segundos configurado na lambda.
Gráfico de duração da execução (em milissegundos) da lambda antes de aplicar as técnicas de performance, chegando a picos de 27 segundos de duração:
A fila a qual a lambda consumia as mensagens, recebia cargas com até 2.500 mensagens para processar:
RESULTADOS APÓS PERFORMANCE
Após aplicar o Redis pipelining, alguns dos resultados que obtivemos na Lambda:
O maior pico de duração foi de 12,6 segundos.
Conclusão
O resultado foi bem positivo, tendo em vista que na maioria dos casos chegaram a reduzir pela metade o tempo de duração, além disto, em cenários de processamento com o mesmo número de mensagem não tivemos mais nenhum caso de timeout.
Após o uso do Redis Pipelining, também foram feitas algumas refatorações e mudanças na forma de processar a mensagem para melhorar ainda mais o tempo de execução da lambda.
Top comments (0)