Pular para conteúdo

Solução 02 - Arquitetura e Gateway 🏗️

Navegação

← Exercício 02 | Próxima Solução →

🟢 Respostas Fáceis

1. Conceitos - API Gateway com Analogia

Resposta 1

Um API Gateway é como uma recepção de hotel:

- Os hóspedes (clientes) chegam na recepção (gateway) em vez de ir direto aos quartos (serviços)
- A recepção **verifica a identidade** (autenticação), distribui as chaves (autorização) e direciona para o setor correto
- Se há um problema no elevador (falha em um serviço), a recepção informa e oferece alternativas
- Centraliza o **controle de acesso** e **monitora** quem entra e sai

O Gateway gerencia **roteamento**, **segurança** e **monitoramento** de todas as chamadas para os microsserviços.

2. Síncrono vs Assíncrono - Diferenciação

Resposta 2

Comunicação Síncrona: O cliente fica aguardando a resposta completa antes de continuar (como uma ligação telefônica).

**Comunicação Assíncrona**: O cliente envia a solicitação e **continua** suas atividades, recebendo a resposta quando estiver pronta (como um WhatsApp).

🟡 Respostas Médias

3. Resiliência - Impacto da Lentidão do Banco

Resposta 3

Efeito Cascata em Sistema Síncrono:

```mermaid
graph TD
    A[Cliente Web] -->|1. Requisição| B[API Gateway]
    B -->|2. Timeout| C[Serviço Usuário]
    C -->|3. Query Lenta| D[Banco de Dados 🐌]

    B -->|4. Bloqueado| E[Outros Serviços]
    B -->|5. Fila de Requisições| F[Mais Clientes ⏰]

    style D fill:#ff6b6b
    style F fill:#ff9999
```

**Consequências:**
- **Timeouts** em cascata afetam todos os serviços
- **Thread pool** do servidor se esgota aguardando o banco
- **Usuários** experimentam lentidão crescente
- **Site pode ficar indisponível** mesmo com outros serviços funcionando

**Solução**: Circuit breaker, timeout configurado, cache, réplicas de leitura.

4. Segurança - Centralização da Autenticação

Resposta 4

Vantagens da Autenticação Centralizada:

**❌ Sem Gateway (Descentralizado):**
- **20 implementações** diferentes de autenticação
- **20 pontos de falha** de segurança
- **Inconsistência** nas regras de negócio
- **Dificuldade** para auditoria e logs

**✅ Com Gateway (Centralizado):**
- **1 ponto de controle** para todas as chamadas
- **Padronização** das validações de token
- **Auditoria centralizada** de acessos
- **Facilita** rotação de chaves e políticas de segurança

🔴 Resposta Desafio

5. Cenário de Falha Crítica - Serviço de Notificação

Resposta 5

Análise Comparativa:

**🔴 Abordagem Síncrona:**
```mermaid
sequenceDiagram
    Cliente->>+Checkout: Finalizar Compra
    Checkout->>+Pagamento: Processar
    Pagamento-->>-Checkout: ✅ Aprovado
    Checkout->>+Notificação: Enviar E-mail
    Note over Notificação: ❌ SERVIÇO FORA DO AR
    Notificação-->>-Checkout: ❌ ERRO 500
    Checkout-->>-Cliente: ❌ FALHA NA COMPRA
```

**Resultado**: ❌ **Compra falha completamente**, mesmo com pagamento aprovado!

**✅ Abordagem Assíncrona com Filas:**
```mermaid
sequenceDiagram
    Cliente->>+Checkout: Finalizar Compra
    Checkout->>+Pagamento: Processar
    Pagamento-->>-Checkout: ✅ Aprovado
    Checkout->>Fila: Publicar Evento
    Note over Fila: 📧 E-mail agendado
    Checkout-->>-Cliente: ✅ COMPRA CONFIRMADA

    Note over Notificação: ❌ Serviço fora do ar
    Note over Fila: Mensagens acumulando...

    Note over Notificação: ✅ Serviço voltou!
    Fila->>+Notificação: Processar E-mails
    Notificação-->>-Fila: ✅ E-mails enviados
```

**Benefícios**:
- ✅ **Compra é finalizada** independentemente da notificação
- ✅ **E-mails são enviados** quando o serviço voltar
- ✅ **Experiência do usuário** preservada
- ✅ **Resilência** automática do sistema

**🔄 Exemplo de Serviço que PRECISA ser Síncrono:**
- **Validação de CPF/Cartão** durante pagamento
- **Consulta de saldo** bancário
- **Autenticação/Login** de usuários
- **Verificação de estoque** para produtos limitados

Estes serviços **bloqueiam a operação** se falharem, pois são críticos para a decisão imediata.

Implementação com Tecnologias

```python # Exemplo assíncrono com Redis/RabbitMQ @app.route('/checkout', methods=['POST']) def finalizar_compra(): # 1. Processa pagamento (síncrono - crítico) pagamento = processar_pagamento(dados) if not pagamento.aprovado: return {"erro": "Pagamento rejeitado"}, 400

    # 2. Salva pedido
    pedido = salvar_pedido(dados)

    # 3. Agenda notificação (assíncrono)
    queue.publish({
        "evento": "pedido_criado",
        "pedido_id": pedido.id,
        "email": dados.email
    })

    # 4. Resposta imediata para o cliente
    return {"sucesso": True, "pedido_id": pedido.id}, 201
```

!!! tip "Dicas para Próximos Estudos" - Estude patterns de resiliência: Circuit Breaker, Bulkhead, Timeout - Pratique com Apache Kafka ou RabbitMQ para filas - Implemente health checks em seus serviços - Use ferramentas de monitoramento como Prometheus + Grafana

Navegação

← Exercício 02 | Próxima Solução →