Envoy Proxy :: Configurando retry policies para solicitações HTTP

Share:


Mais um post da série de Envoy Proxy. Nesse post vamos exemplificar como implementar politicas de retry pra uma rota no envoy. Essa é uma das funcionalidades mais legais do Envoy Proxy. Nesse post iremos criar um lab parecido com o do anterior por conter mais componentes. Além do build da imagem do Envoy, iremos subir uma segunda aplicação de exemplo e colocar atrás do mesmo. Essa aplicação é preparada pra essa demo.


O que é uma retry policy?

Uma retry policy, ou politica de retentativa no Brasa,  é literalmente o fato descrever uma condição específica na qual o request que falhou será re-efetuado sem a interação da parte do cliente.

Por exemplo, no caso uma requisição de cliente retorne um erro 5xx da parte do servidor, o proxy reverso, no caso o envoy, irá refazer a requisição para a politica de load balancer sem que o cliente saiba.

Esse tipo de arquitetura pode ser muito boa pra casos onde existam instabilidades ocasionais na aplicação, muito rápidas e muito difíceis de serem previstas. O Envoy cuidará disso sem que haja muitos problemas.

Confira esse exemplo no Github


Dockerfile

O arquivo Dockerfile é exatamente igual ao dos outros posts (se você acompanhou). Vamos usar a versão 1.12.2 nesse lab.



O docker-compose.yml do lab

O arquivo docker-compose está descrito o ambiente da demo. Basicamente iremos subir um container que contém uma aplicação que retorna status codes aleatórios. Eu criei essa API pra esses casos de teste, então fiquem a vontade pra usar sempre que precisar, está publica no meu Dockerhub.



O arquivo envoy.yaml

O envoy trabalha através de um arquivo de configuração yaml. Abaixo segue o exemplo desse lab. Segue o mesmo padrão dos demais, porém com a adição de um detalhe, que é justamente o que nos permite configurar as retry policies no Envoy. 


Na configuração das rotas na chave route_config, podemos adicionar o parâmetro retry_policy onde podemos especificar nossa policy de retry. Nesse exemplo em especifico, eu quero que todos os erros da familia 500 (Internal Server Error) entrem na politica de retentativa do envoy, por no máximo 10x, com o timeout máximo de 2s. Essa é a forma mais básica de configurar esse recurso no Envoy Proxy.



Subindo o lab 

Vamos subir o ambiente do compose que demonstramos anteriormente.
docker-compose build
docker-compose up --force-recreate



Testando a politica de retry 

Esse serviço que faremos deploy para teste retorna status codes pré-selecionados de forma aleatória. No caso desse endpoint testado, um mix de 50% de Status 200 (Ok) e 50% de Status 500 (Internal Server Error).

Acessando o serviço diretamente

Vamos acessar o serviço diretamente na porta 9090, sem passar pelo envoy com as politicas configuradas.

while true; do curl localhost:9090/random/500; echo; done;




Acessando o serviço através do Envoy Proxy

Agora vamos acessar o mesmo endpoint através da porta 8080, passando pelo envoy com as politicas de retry configuradas para teste.
while true; do curl localhost:8080/random/500; echo; done;


Magico, né? Mas cuidado... Não é pra todos os casos.
Espero ter ajudado :)

Nenhum comentário