Fundamentos do padrão de novas tentativas
Aprenda os conceitos básicos do padrão de novas tentativas para repetir automaticamente operações falhadas e melhorar a robustez do sistema.
Fundamentos do padrão de novas tentativas é uma aula grátis de Microservices Communication Patterns (Saga, Circuit Breaker) no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Microservices Communication Patterns (Saga, Circuit Breaker), e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Microservices Communication Patterns (Saga, Circuit Breaker) inclui 4 aulas no total.
Partes desta aula ainda não foram traduzidas e aparecem em inglês.
Facing Temporary Glitches?
Imagine you're trying to send a message, but your internet connection blips for a second. What do you do?
You probably try again! This simple human behavior is the core idea behind the Retry Pattern in software.
What is the Retry Pattern?
The Retry Pattern is a fundamental resilience technique. It involves automatically re-attempting an operation that has failed.
It's used when we expect the failure to be transient, meaning temporary and likely to resolve itself shortly, such as a brief network outage or a temporary database lock.
Why Use Retries?
In distributed systems, services often depend on each other. Failures can occur for many reasons:
- Network issues: A brief disconnection or high latency.
- Resource contention: A database or service is temporarily overloaded.
- Service restarts: A dependent service is briefly unavailable during an update.
Retries help your application recover gracefully from these hiccups without crashing or requiring manual intervention.
The Basic Retry Loop
At its simplest, the retry pattern works like this:
- Attempt an operation.
- If it fails, check if it's a retriable error.
- If retriable, increment a counter and try again.
- Stop after a certain number of attempts or if it succeeds.
Let's see a basic example without any delays yet.
Code: Simple Retry Logic
This code simulates an operation that fails twice before succeeding. Notice how the while loop keeps trying until it works or runs out of attempts.
public class Main {
public static void main(String[] args) {
boolean success = false;
int maxAttempts = 3;
int currentAttempt = 0;
while (!success && currentAttempt < maxAttempts) {
currentAttempt++;
System.out.println("Attempt " + currentAttempt + ": Trying to connect...");
// Simulate failure for first two attempts
if (currentAttempt < 3) {
System.out.println("Connection failed!");
} else {
System.out.println("Connection successful!");
success = true;
}
}
if (!success) {
System.out.println("Failed after " + maxAttempts + " attempts.");
}
}
}Adding a Delay: Fixed Retry
Simply retrying immediately might overwhelm a struggling service or fail again if the issue needs time to resolve. That's why we add delays.
A Fixed Delay Retry waits the same amount of time between each failed attempt. This gives the system a chance to recover.
Code: Fixed Delay Retry
Here, we've added a 1-second delay (1000ms) using Thread.sleep() after each failed attempt. This is a common practice to give the system some breathing room.
public class Main {
public static void main(String[] args) {
boolean success = false;
int maxAttempts = 3;
int currentAttempt = 0;
long delayMillis = 1000; // 1 second delay
while (!success && currentAttempt < maxAttempts) {
currentAttempt++;
System.out.println("Attempt " + currentAttempt + ": Trying to connect...");
// Simulate failure for first two attempts
if (currentAttempt < 3) {
System.out.println("Connection failed!");
try {
Thread.sleep(delayMillis); // Wait before retrying
System.out.println("Waiting " + delayMillis + "ms...");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
} else {
System.out.println("Connection successful!");
success = true;
}
}
if (!success) {
System.out.println("Failed after " + maxAttempts + " attempts.");
}
}
}Smarter Waits: Exponential Backoff
While fixed delays work, sometimes it's better to increase the wait time with each successive retry. This is called Exponential Backoff.
For example, you might wait 1s, then 2s, then 4s, then 8s. This reduces the load on a struggling service and gives it more time to recover.
When to Use the Retry Pattern
Retries are most effective for:
- Transient network errors: Brief disconnections, timeouts.
- Temporary resource unavailability: A database connection pool is momentarily exhausted.
- Optimistic concurrency conflicts: When multiple users try to update the same record at once.
- Brief service restarts: A microservice is being redeployed.
When NOT to Use Retries
Retries are not a silver bullet. Avoid using them for:
- Non-transient errors: Errors caused by invalid input, authorization failures, or missing resources that won't resolve on their own.
- Non-idempotent operations: If repeating an operation has unintended side effects (e.g., charging a customer twice). Idempotency means an operation can be performed multiple times without changing the result beyond the initial application.
- Long-lasting failures: If a service is permanently down or has a major outage.
Test Your Knowledge!
Which scenario is generally a good candidate for applying the Retry Pattern?
Retry Pattern Summary
You've learned the fundamentals of the Retry Pattern!
- It's for automatically re-attempting failed operations.
- It's crucial for handling transient failures in distributed systems.
- Basic implementation involves a loop with a maximum number of attempts.
- Adding delays (fixed or exponential backoff) is key to giving systems time to recover.
- Know when to use it (e.g., network issues) and when to avoid it (e.g., non-transient errors, non-idempotent operations).
Next, we'll explore other resilience patterns like fallbacks and timeouts!
Perguntas Frequentes
A aula “Fundamentos do padrão de novas tentativas” é grátis?
Sim — o texto completo de “Fundamentos do padrão de novas tentativas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Microservices Communication Patterns (Saga, Circuit Breaker), atualize para CoddyKit PRO. O curso de Microservices Communication Patterns (Saga, Circuit Breaker) inclui 4 aulas no total.
O que vou aprender em “Fundamentos do padrão de novas tentativas”?
Aprenda os conceitos básicos do padrão de novas tentativas para repetir automaticamente operações falhadas e melhorar a robustez do sistema. Você pratica Microservices Communication Patterns (Saga, Circuit Breaker) com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Microservices Communication Patterns (Saga, Circuit Breaker)?
Nenhuma experiência prévia é necessária. Microservices Communication Patterns (Saga, Circuit Breaker) no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Fundamentos do padrão de novas tentativas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Microservices Communication Patterns (Saga, Circuit Breaker)?
Sim. Cada aula de Microservices Communication Patterns (Saga, Circuit Breaker) inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Porque é importante a resiliência
- Fundamentos do padrão de novas tentativas
- Implementação de alternativas e tempos limite
- O padrão Bulkhead