SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
@maiconpereira
@maiconcp
@maiconcp
“É a capacidade da aplicação de se recuperar de falhas e continuar a
funcionar”
- melhor cenário: Sem o usuário perceber
- Pior cenário: “graceful degradation” do serviço, ou seja, oferecer o serviço de
forma limitada (algo como ser tolerante a falhas)
• Transiente
• Ocorre uma vez e depois desaparece
• Se a operação for repetida, a falha não acontecerá novamente
• Intermitente
• Ocorre e desaparece por “sua própria vontade”. Ex.: conector com problemas
• Difícil de diagnosticar
• Permanente:
• Continua a existir até que o componente faltoso seja substituído
• Exs: bugs de software, chips queimados
http://www.fisiocomp.ufjf.br/anapaula/SD/SD_aula_13.pdf
http://www.fisiocomp.ufjf.br/anapaula/SD/SD_aula_13.pdf
1. A rede é confiável
2. A latência é zero
3. A banda é infinita
4. A rede é segura
5. A topologia é imutável
6. Existe apenas um administrador
7. Não há custo para transporte de dados
8. A rede é homogênea
https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
99,5%
99,5%
99,5%
99,5%
99,5%
99,5%
97,5%
Falhas Transientes
• Mover contêiner de nó
• Falhas na rede
• Deploy
• Aplicado à: Falhas curtas, como por exemplo:
• quando se está movendo um container de nó
• ou falhas nas rede;
• Como: Realizando novas tentativas quando um serviço estiver
indisponível por um período de tempo
Premissa Aka Como a politica ajuda?
Muitas falhas são
transitórias e podem se
auto-corrigir após um
pequeno tempo.
“Talvez seja apenas um
episódio”
Permite configurar re-
tentativas automáticas
Send
Retry
Policy
Retries:
Variações
• RetryForever: Tentar indefinidamente
• Retry(X): Tentar X vezes
• WaitAndRetry(x,y): Tentar X vezes com um intervalo de Y entre
tentativas
Quanto
tempo
esperar antes
de repetir?
• Refere-se ao tempo dos intervalos entre tentativas,
eles crescem exponencialmente a cada tentativa... Acho que já vi
isso...
0
50
100
150
200
250
300
350
1 2 3 4 5 6 7 8 9
Segundos
Número da Tentativa
• Ponto de Atenção: Muitas novas tentativas pode sobrecarregar o
servidor podendo gerar um DoS (Denial of Service – Negação do
Serviço);
Já sei como
implementar
isso... For..
Try..catch......
• Fluent
• Reusabilidade
• Thread Safe
• Suporte Async
// Retry a specified number of times, using a function to
// calculate the duration to wait between retries based on
// the current retry attempt (allows for exponential backoff)
// In this case will wait for
// 2 ^ 1 = 2 seconds then
// 2 ^ 2 = 4 seconds then
// 2 ^ 3 = 8 seconds then
// 2 ^ 4 = 16 seconds then
// 2 ^ 5 = 32 seconds
Policy
.Handle<SomeException>()
.WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))
.Execute(() =>
{
// do....
});
Padrão Disjuntor
• Manter a integridade do sistema
Premissa Aka
Como a política
ajuda?
Quando um Sistema está
sobrecarregado, falhar
rápido é melhor do que
fazer o chamador esperar.
Protejer o Sistema, pode
ajudá-lo a se recuperar
“Dê um tempo ao sistema"
Quebra o circuito
(bloqueia execuções)
por um período,
quando as falhas
excedem algum limite
pré-configurado..
Send
Circuit
Breaker
Threshold:
// Break the circuit after the specified number of consecutive exceptions
// and keep circuit broken for the specified duration.
Policy
.Handle<SomeExceptionType>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1));
Policy
.Handle<TException>(...)
.AdvancedCircuitBreaker(
failureThreshold: 0.5,
samplingDuration: TimeSpan.FromSeconds(5),
minimumThroughput: 20,
durationOfBreak: TimeSpan.FromSeconds(30))
• Todos as aplicações clientes deveriam trabalhar com um tempo limite
para não ficarem bloqueadas indeterminadamente esperando uma
resposta;
Premissa Aka Como a política ajuda?
Depois um certo tempo,
um resultado de sucesso é
improvável.
“Não espere para sempre”
Garante que o chamador
não terá que esperar além
do tempo limite.
Send
Timeout
Policy
// Timeout after 30 seconds, if the executed delegate has not completed.
// Enforces this timeout even if the executed code has no cancellation mechanism.
Policy
.Timeout(30, TimeoutStrategy.Pessimistic)
Premissa Aka Como a política ajuda?
As coisas ainda falharão -
planeje o que você fará
quando isso acontecer.
“Falha graciosamente”
Define um valor alternativo
a ser retornado (ou ação a
ser executada) em caso de
falha.
Profile
Fallback
Policy
Obter Imagem Perfil
// Provide a substitute value, if an execution faults.
Policy<UserAvatar>
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank)
.Execute...
• Cache de Leitura
• Reduz o tempo da chamada
• Reduz o tráfego na rede
• Reduz a sobrecarga do destinatário
Premissa Aka Como a política ajuda?
Algumas solicitações
serão semelhantes.
"Você pediu isso antes"
Fornece uma resposta do cache, se conhecido.
Armazena as respostas automaticamente no cache,
quando recuperadas pela primeira vez.
Install-Package Polly.Caching.Memory
Install-Package Microsoft.Extensions.Caching.Memory
public class PollyCacheSample
{
public CachePolicy<string> CachePolicy =>
Policy.Cache<string>(_memoryCacheProvider, TimeSpan.FromMinutes(5));
private readonly MemoryCacheProvider _memoryCacheProvider;
public PollyCacheSample()
{
// This approach creates a CachePolicy directly,
// with its own Microsoft.Extensions.Caching.Memory.MemoryCache instance:
var memoryCache = new MemoryCache(new MemoryCacheOptions());
_memoryCacheProvider = new MemoryCacheProvider(memoryCache);
}
public void GetSomeThingById(int id)
{
var policyResult = CachePolicy.Execute(context =>
{
return new ClientService().GetSomeThing(id);
}, new Context(operationKey: id.ToString()));
}
CriandoacachePolíticaExecução
• Isolar as partes da aplicação em pools para que, se um falhar, os
outros continuarão a funcionar.
• Limita a paralelização
"Uma falha não deve afundar
o navio inteiro"
• “Falhas diferentes requerem estratégias diferentes; resiliência
significa usar uma combinação.”
// Define a combined policy strategy, built of previously-defined policies.
var policyWrap = Policy
.Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
// (wraps the policies around any executed delegate: fallback outermost ...
bulkhead innermost)
policyWrap.Execute(...)
// Define a standard resilience strategy ...
PolicyWrap commonResilience = Policy.Wrap(retry, breaker, timeout);
ASP
• Mesmo após o dispose do HttpClient, o soquete não é liberado imediatamente e pode
causar um problema sério chamado 'esgotamento de soquetes'.
• Portanto, HttpClient deve ser instanciado uma única vez e reutilizado durante a vida útil
da aplicação
• O uso do HttpClient como um Singleton ou Static pode ocasionar um outro problema
quando há alteração de DNS (ver documentação no site da Microsoft)
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
using (var httpCliente = new HttpClient())
{
...
}
https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
O HttpClientFactory é um recurso do ASPNET Core 2.1
É uma factory facilita o uso do HttpClient
Install-Package Microsoft.Extensions.Http
// Startup.cs
//Add http client services at ConfigureServices(IServiceCollection services)
services.AddHttpClient<ICatalogService, CatalogService>();
services.AddHttpClient<IBasketService, BasketService>();
services.AddHttpClient<IOrderingService, OrderingService>();
public void ConfigureServices(IServiceCollection services)
{
O código criará um HttpClient configurado especificamente para cada serviço,
https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
public class CatalogService : ICatalogService
{
private readonly HttpClient _httpClient;
private readonly string _remoteServiceBaseUrl;
public CatalogService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<Catalog> GetCatalogItems(int page, int take,
int? brand, int? type)
{
var uri = API.Catalog.GetAllCatalogItems(_remoteServiceBaseUrl,
page, take, brand, type);
var responseString = await _httpClient.GetStringAsync(uri);
...
}
} https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
Install-Package Microsoft.Extensions.Http.Polly
//ConfigureServices() - Startup.cs
services.AddHttpClient<IBasketService, BasketService>()
.AddPolicyHandler(GetRetryPolicy());
// Retry Policy
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
• Um método é considerado idempotente se o resultado de uma
requisição realizada com sucesso é independente do número de vezes
que é executada.
http://www.elemarjr.com/pt/2018/01/lidando-com-falhas-de-conexao-em-microsservicos/
https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections
• Como podemos reagir em caso de falha?
• Que valor posso retornar se o serviço estiver fora?
• Aceitaremos uma “Consistência Eventual” ?
https://github.com/App-vNext/Polly
http://www.thepollyproject.org/
https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/
• https://github.com/App-vNext/Polly
• http://www.thepollyproject.org/
• https://docs.microsoft.com/pt-br/dotnet/standard/microservices-
architecture/implement-resilient-applications/
• https://docs.microsoft.com/pt-br/dotnet/standard/microservices-
architecture/implement-resilient-applications/use-httpclientfactory-to-
implement-resilient-http-requests
• https://docs.microsoft.com/pt-br/aspnet/core/fundamentals/http-
requests?view=aspnetcore-2.2
• https://docs.microsoft.com/pt-br/dotnet/standard/microservices-
architecture/implement-resilient-applications/implement-http-call-retries-
exponential-backoff-polly
• https://www.infoq.com/br/presentations/como-sua-aplicacao-deve-se-
comportar-quando-tudo-da-errado
• https://www.infoq.com/br/presentations/resiliencia-com-microservices-
cache-distribuido-feedback-e-tuning
• https://medium.com/beelab/criando-chamadas-http-resilientes-utilizando-
polly-com-httpclient-factory-eafb2644a244
• https://www.infoq.com/presentations/polly
• https://www.slideshare.net/ufried/resilience-reloaded-more-resilience-
patterns
• https://searchnetworking.techtarget.com/definition/graceful-degradation
@maiconpereira
@maiconcp
@maiconcp

Mais conteúdo relacionado

Mais procurados

Processos threads senai
Processos threads senaiProcessos threads senai
Processos threads senaiCarlos Melo
 
(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09Norton Trevisan Roman
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...tdc-globalcode
 
(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12Norton Trevisan Roman
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsEvandro Júnior
 
Gerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoGerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoAlexandre Duarte
 
Fundamentos de Sistemas Operacionais de Tempo Real - Criando seu próprio esc...
Fundamentos de Sistemas  Operacionais de Tempo Real - Criando seu próprio esc...Fundamentos de Sistemas  Operacionais de Tempo Real - Criando seu próprio esc...
Fundamentos de Sistemas Operacionais de Tempo Real - Criando seu próprio esc...Marcelo Barros de Almeida
 
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...iMasters
 
Desenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPDesenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPElton Minetto
 
Mudança de runlevels e desligamento do sistema
Mudança de runlevels e desligamento do sistemaMudança de runlevels e desligamento do sistema
Mudança de runlevels e desligamento do sistemaSoftD Abreu
 
Sistema Operacional de Tempo Real (vx works)
Sistema Operacional de Tempo Real (vx works)Sistema Operacional de Tempo Real (vx works)
Sistema Operacional de Tempo Real (vx works)Jose Silva
 

Mais procurados (13)

Aula 03-deadlock
Aula 03-deadlockAula 03-deadlock
Aula 03-deadlock
 
Processos threads senai
Processos threads senaiProcessos threads senai
Processos threads senai
 
(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09(ACH2044) Sistemas Operacionais - Aula 09
(ACH2044) Sistemas Operacionais - Aula 09
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
 
Processos e threads cap 02 (i unidade)
Processos e threads   cap 02 (i unidade)Processos e threads   cap 02 (i unidade)
Processos e threads cap 02 (i unidade)
 
(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12(ACH2044) Sistemas Operacionais - Aula 12
(ACH2044) Sistemas Operacionais - Aula 12
 
Arquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e ThreadsArquitetura de Computadores: Processos e Threads
Arquitetura de Computadores: Processos e Threads
 
Gerências de Processos: Sincronização
Gerências de Processos: SincronizaçãoGerências de Processos: Sincronização
Gerências de Processos: Sincronização
 
Fundamentos de Sistemas Operacionais de Tempo Real - Criando seu próprio esc...
Fundamentos de Sistemas  Operacionais de Tempo Real - Criando seu próprio esc...Fundamentos de Sistemas  Operacionais de Tempo Real - Criando seu próprio esc...
Fundamentos de Sistemas Operacionais de Tempo Real - Criando seu próprio esc...
 
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
JS Experience 2017 - Utilizando a virtualização para simplificar o desenvolvi...
 
Desenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHPDesenvolvendo aplicações Web escaláveis com PHP
Desenvolvendo aplicações Web escaláveis com PHP
 
Mudança de runlevels e desligamento do sistema
Mudança de runlevels e desligamento do sistemaMudança de runlevels e desligamento do sistema
Mudança de runlevels e desligamento do sistema
 
Sistema Operacional de Tempo Real (vx works)
Sistema Operacional de Tempo Real (vx works)Sistema Operacional de Tempo Real (vx works)
Sistema Operacional de Tempo Real (vx works)
 

Semelhante a Implementando resiliência em APIs .NET com Polly

Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Thiago Rondon
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveiselliando dias
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisrafaelberlanda
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Claudio Miranda
 
Apresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLApresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLJohnes Castro
 
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...Gleicon Moraes
 
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...Kelver Merlotti
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoTechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoFabrício Catae
 
5 dicas simples de performance
5 dicas simples de performance5 dicas simples de performance
5 dicas simples de performanceCleber Dantas
 
Aula 3 (alta disponibilidade)
Aula 3 (alta disponibilidade)Aula 3 (alta disponibilidade)
Aula 3 (alta disponibilidade)Evandro Júnior
 
Cache em aplicações web
Cache em aplicações webCache em aplicações web
Cache em aplicações webJean Carlo Emer
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Fabiano Weimar
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010lucashungaro
 
Qcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsQcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsJorge Walendowsky
 
Async/Await Pattern in C#
Async/Await Pattern in C#Async/Await Pattern in C#
Async/Await Pattern in C#Leandro Silva
 
Oracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasOracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasLeonardo Pedroso Costa
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiMateus Ramos Pereira
 
Forefront TMG - Planejando corretamente
Forefront TMG - Planejando corretamenteForefront TMG - Planejando corretamente
Forefront TMG - Planejando corretamenteUilson Souza
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreRafael Gomes
 

Semelhante a Implementando resiliência em APIs .NET com Polly (20)

Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 
Desenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveisDesenvolvendo aplicações Web escaláveis
Desenvolvendo aplicações Web escaláveis
 
Joomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portaisJoomla Day Brasil 2010: Customizações para grandes portais
Joomla Day Brasil 2010: Customizações para grandes portais
 
Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7Dicas para Turbinar o servidor de Aplicações JBoss 7
Dicas para Turbinar o servidor de Aplicações JBoss 7
 
Apresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQLApresentação PGDAY - Replicação Nativa - PostgreSQL
Apresentação PGDAY - Replicação Nativa - PostgreSQL
 
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
QCon SP 2015 - Advogados do diabo: como a arquitetura emergente de sua aplica...
 
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
Datasnap avançado - Respostas para um sistema robusto - Embarcadero Conferenc...
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoTechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
 
5 dicas simples de performance
5 dicas simples de performance5 dicas simples de performance
5 dicas simples de performance
 
Aula 3 (alta disponibilidade)
Aula 3 (alta disponibilidade)Aula 3 (alta disponibilidade)
Aula 3 (alta disponibilidade)
 
Cache em aplicações web
Cache em aplicações webCache em aplicações web
Cache em aplicações web
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
 
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
Coisas que aprendi e quero passar adiante - RubyConf Brasil 2010
 
Qcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.jsQcon 2013 - Walmart Frontend Solution using Node.js
Qcon 2013 - Walmart Frontend Solution using Node.js
 
Async/Await Pattern in C#
Async/Await Pattern in C#Async/Await Pattern in C#
Async/Await Pattern in C#
 
Oracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferençasOracle e SQL Server na prática mitos, semelhanças e diferenças
Oracle e SQL Server na prática mitos, semelhanças e diferenças
 
Trabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial IiTrabalho ProgramaçãO Comercial Ii
Trabalho ProgramaçãO Comercial Ii
 
Forefront TMG - Planejando corretamente
Forefront TMG - Planejando corretamenteForefront TMG - Planejando corretamente
Forefront TMG - Planejando corretamente
 
Elastic MeetUp Porto Alegre
Elastic MeetUp Porto AlegreElastic MeetUp Porto Alegre
Elastic MeetUp Porto Alegre
 

Implementando resiliência em APIs .NET com Polly

  • 2.
  • 3. “É a capacidade da aplicação de se recuperar de falhas e continuar a funcionar” - melhor cenário: Sem o usuário perceber - Pior cenário: “graceful degradation” do serviço, ou seja, oferecer o serviço de forma limitada (algo como ser tolerante a falhas)
  • 4. • Transiente • Ocorre uma vez e depois desaparece • Se a operação for repetida, a falha não acontecerá novamente • Intermitente • Ocorre e desaparece por “sua própria vontade”. Ex.: conector com problemas • Difícil de diagnosticar • Permanente: • Continua a existir até que o componente faltoso seja substituído • Exs: bugs de software, chips queimados http://www.fisiocomp.ufjf.br/anapaula/SD/SD_aula_13.pdf
  • 6. 1. A rede é confiável 2. A latência é zero 3. A banda é infinita 4. A rede é segura 5. A topologia é imutável 6. Existe apenas um administrador 7. Não há custo para transporte de dados 8. A rede é homogênea https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
  • 7. 99,5% 99,5% 99,5% 99,5% 99,5% 99,5% 97,5% Falhas Transientes • Mover contêiner de nó • Falhas na rede • Deploy
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14. • Aplicado à: Falhas curtas, como por exemplo: • quando se está movendo um container de nó • ou falhas nas rede; • Como: Realizando novas tentativas quando um serviço estiver indisponível por um período de tempo Premissa Aka Como a politica ajuda? Muitas falhas são transitórias e podem se auto-corrigir após um pequeno tempo. “Talvez seja apenas um episódio” Permite configurar re- tentativas automáticas
  • 16. Variações • RetryForever: Tentar indefinidamente • Retry(X): Tentar X vezes • WaitAndRetry(x,y): Tentar X vezes com um intervalo de Y entre tentativas
  • 18. • Refere-se ao tempo dos intervalos entre tentativas, eles crescem exponencialmente a cada tentativa... Acho que já vi isso...
  • 19. 0 50 100 150 200 250 300 350 1 2 3 4 5 6 7 8 9 Segundos Número da Tentativa
  • 20. • Ponto de Atenção: Muitas novas tentativas pode sobrecarregar o servidor podendo gerar um DoS (Denial of Service – Negação do Serviço);
  • 21. Já sei como implementar isso... For.. Try..catch......
  • 22. • Fluent • Reusabilidade • Thread Safe • Suporte Async
  • 23. // Retry a specified number of times, using a function to // calculate the duration to wait between retries based on // the current retry attempt (allows for exponential backoff) // In this case will wait for // 2 ^ 1 = 2 seconds then // 2 ^ 2 = 4 seconds then // 2 ^ 3 = 8 seconds then // 2 ^ 4 = 16 seconds then // 2 ^ 5 = 32 seconds Policy .Handle<SomeException>() .WaitAndRetry(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))) .Execute(() => { // do.... });
  • 25. • Manter a integridade do sistema Premissa Aka Como a política ajuda? Quando um Sistema está sobrecarregado, falhar rápido é melhor do que fazer o chamador esperar. Protejer o Sistema, pode ajudá-lo a se recuperar “Dê um tempo ao sistema" Quebra o circuito (bloqueia execuções) por um período, quando as falhas excedem algum limite pré-configurado..
  • 27. // Break the circuit after the specified number of consecutive exceptions // and keep circuit broken for the specified duration. Policy .Handle<SomeExceptionType>() .CircuitBreaker(2, TimeSpan.FromMinutes(1)); Policy .Handle<TException>(...) .AdvancedCircuitBreaker( failureThreshold: 0.5, samplingDuration: TimeSpan.FromSeconds(5), minimumThroughput: 20, durationOfBreak: TimeSpan.FromSeconds(30))
  • 28.
  • 29. • Todos as aplicações clientes deveriam trabalhar com um tempo limite para não ficarem bloqueadas indeterminadamente esperando uma resposta; Premissa Aka Como a política ajuda? Depois um certo tempo, um resultado de sucesso é improvável. “Não espere para sempre” Garante que o chamador não terá que esperar além do tempo limite.
  • 31. // Timeout after 30 seconds, if the executed delegate has not completed. // Enforces this timeout even if the executed code has no cancellation mechanism. Policy .Timeout(30, TimeoutStrategy.Pessimistic)
  • 32.
  • 33. Premissa Aka Como a política ajuda? As coisas ainda falharão - planeje o que você fará quando isso acontecer. “Falha graciosamente” Define um valor alternativo a ser retornado (ou ação a ser executada) em caso de falha.
  • 35. // Provide a substitute value, if an execution faults. Policy<UserAvatar> .Handle<Whatever>() .Fallback<UserAvatar>(UserAvatar.Blank) .Execute...
  • 36.
  • 37. • Cache de Leitura • Reduz o tempo da chamada • Reduz o tráfego na rede • Reduz a sobrecarga do destinatário Premissa Aka Como a política ajuda? Algumas solicitações serão semelhantes. "Você pediu isso antes" Fornece uma resposta do cache, se conhecido. Armazena as respostas automaticamente no cache, quando recuperadas pela primeira vez.
  • 39. public class PollyCacheSample { public CachePolicy<string> CachePolicy => Policy.Cache<string>(_memoryCacheProvider, TimeSpan.FromMinutes(5)); private readonly MemoryCacheProvider _memoryCacheProvider; public PollyCacheSample() { // This approach creates a CachePolicy directly, // with its own Microsoft.Extensions.Caching.Memory.MemoryCache instance: var memoryCache = new MemoryCache(new MemoryCacheOptions()); _memoryCacheProvider = new MemoryCacheProvider(memoryCache); } public void GetSomeThingById(int id) { var policyResult = CachePolicy.Execute(context => { return new ClientService().GetSomeThing(id); }, new Context(operationKey: id.ToString())); } CriandoacachePolíticaExecução
  • 40.
  • 41. • Isolar as partes da aplicação em pools para que, se um falhar, os outros continuarão a funcionar. • Limita a paralelização "Uma falha não deve afundar o navio inteiro"
  • 42.
  • 43. • “Falhas diferentes requerem estratégias diferentes; resiliência significa usar uma combinação.” // Define a combined policy strategy, built of previously-defined policies. var policyWrap = Policy .Wrap(fallback, cache, retry, breaker, timeout, bulkhead); // (wraps the policies around any executed delegate: fallback outermost ... bulkhead innermost) policyWrap.Execute(...) // Define a standard resilience strategy ... PolicyWrap commonResilience = Policy.Wrap(retry, breaker, timeout);
  • 44. ASP
  • 45. • Mesmo após o dispose do HttpClient, o soquete não é liberado imediatamente e pode causar um problema sério chamado 'esgotamento de soquetes'. • Portanto, HttpClient deve ser instanciado uma única vez e reutilizado durante a vida útil da aplicação • O uso do HttpClient como um Singleton ou Static pode ocasionar um outro problema quando há alteração de DNS (ver documentação no site da Microsoft) https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ using (var httpCliente = new HttpClient()) { ... } https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
  • 46. O HttpClientFactory é um recurso do ASPNET Core 2.1 É uma factory facilita o uso do HttpClient
  • 47. Install-Package Microsoft.Extensions.Http // Startup.cs //Add http client services at ConfigureServices(IServiceCollection services) services.AddHttpClient<ICatalogService, CatalogService>(); services.AddHttpClient<IBasketService, BasketService>(); services.AddHttpClient<IOrderingService, OrderingService>(); public void ConfigureServices(IServiceCollection services) { O código criará um HttpClient configurado especificamente para cada serviço, https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
  • 48. public class CatalogService : ICatalogService { private readonly HttpClient _httpClient; private readonly string _remoteServiceBaseUrl; public CatalogService(HttpClient httpClient) { _httpClient = httpClient; } public async Task<Catalog> GetCatalogItems(int page, int take, int? brand, int? type) { var uri = API.Catalog.GetAllCatalogItems(_remoteServiceBaseUrl, page, take, brand, type); var responseString = await _httpClient.GetStringAsync(uri); ... } } https://docs.microsoft.com/pt-br/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests
  • 50. //ConfigureServices() - Startup.cs services.AddHttpClient<IBasketService, BasketService>() .AddPolicyHandler(GetRetryPolicy()); // Retry Policy static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy() { return HttpPolicyExtensions .HandleTransientHttpError() .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); }
  • 51.
  • 52.
  • 53.
  • 54. • Um método é considerado idempotente se o resultado de uma requisição realizada com sucesso é independente do número de vezes que é executada. http://www.elemarjr.com/pt/2018/01/lidando-com-falhas-de-conexao-em-microsservicos/
  • 56. • Como podemos reagir em caso de falha? • Que valor posso retornar se o serviço estiver fora? • Aceitaremos uma “Consistência Eventual” ?
  • 57.
  • 61.
  • 62.
  • 63. • https://github.com/App-vNext/Polly • http://www.thepollyproject.org/ • https://docs.microsoft.com/pt-br/dotnet/standard/microservices- architecture/implement-resilient-applications/ • https://docs.microsoft.com/pt-br/dotnet/standard/microservices- architecture/implement-resilient-applications/use-httpclientfactory-to- implement-resilient-http-requests • https://docs.microsoft.com/pt-br/aspnet/core/fundamentals/http- requests?view=aspnetcore-2.2 • https://docs.microsoft.com/pt-br/dotnet/standard/microservices- architecture/implement-resilient-applications/implement-http-call-retries- exponential-backoff-polly
  • 64. • https://www.infoq.com/br/presentations/como-sua-aplicacao-deve-se- comportar-quando-tudo-da-errado • https://www.infoq.com/br/presentations/resiliencia-com-microservices- cache-distribuido-feedback-e-tuning • https://medium.com/beelab/criando-chamadas-http-resilientes-utilizando- polly-com-httpclient-factory-eafb2644a244 • https://www.infoq.com/presentations/polly • https://www.slideshare.net/ufried/resilience-reloaded-more-resilience- patterns • https://searchnetworking.techtarget.com/definition/graceful-degradation
  • 65.