Externos
Componentes externos são serviços que você chama, mas não opera: uma API de terceiros, um provedor de pagamento, um provedor de e-mail. Muitas vezes são a parte mais lenta e menos previsível de uma requisição, têm seus próprios limites de taxa e suas quedas, e você não pode escalá-los nem consertá-los. Projetar em volta deles é sobretudo contenção: timeouts para que um provedor lento não segure suas threads, retries seguros porque são idempotentes, filas para que o usuário não espere por eles e conciliação, porque a visão deles sobre o mundo e a sua às vezes vão discordar.
No BoxOffice, payment é um adaptador em volta de um provedor de pagamento externo, notification envia os ingressos por um provedor de e-mail e catalog importa dados de eventos das APIs dos produtores.
| Componente | Em uma frase | Id no playground |
|---|---|---|
| 3rd Party API | A API de outra empresa: lenta, com limite de taxa, às vezes fora do ar — contenha-a | thirdparty |
| Payment | Um provedor de pagamento (cartão, Pix, carteiras): idempotência, webhooks, conciliação | payment |
| Um provedor de entrega de e-mail: assíncrono, atrás de uma fila, com regras de entregabilidade | email |
flowchart LR
O[serviço order] -->|timeout + circuit breaker + chave de idempotência| PAY[Provedor de pagamento]
PAY -.webhook: pagamento confirmado.-> WH[endpoint de webhook] --> O
O -->|evento OrderConfirmed| Q[(Fila)] --> N[workers de notificação] --> EM[Provedor de e-mail]
C[importador do catálogo] -->|com limite de taxa e cache| TP[API do produtor]
R[job noturno de conciliação] --> PAY
R --> DB[(Banco de pedidos)] 3rd Party API
O que é. Qualquer API operada por outra empresa da qual o seu sistema depende: mapas e geocodificação, verificação de identidade, frete, feeds de eventos de produtores, clima, provedores de LLM. Você recebe um contrato (documentação, um SLA se tiver sorte, limites de taxa, um preço por chamada) e nada mais: sem acesso às métricas deles, sem controle sobre os deploys deles.
Quando usar.
- Compre em vez de construir quando a capacidade não é o seu diferencial e o provedor a faz melhor (mapas, score de fraude, cálculo de impostos).
- Quando há efeitos regulatórios ou de rede que você não consegue reproduzir (bandeiras de cartão, verificação de identidade).
Quando não usar (ou cuidado).
- Num caminho síncrono voltado ao usuário, cada chamada externa soma sua latência e sua disponibilidade: 99,9% × 99,5% (provedor) ≈ 99,4% para a requisição inteira. Prefira chamadas assíncronas, cache ou pré-cálculo.
- Aprisionamento ao fornecedor: envolva o provedor numa interface sua (um adaptador) para poder trocá-lo ou acrescentar um segundo.
- Proteção de dados: o que você envia (dados pessoais) sai do seu controle; confira os contratos e minimize os campos.
Números-chave.
| Métrica | Valor típico | Observação |
|---|---|---|
| Latência | ≈ 50–500 ms, com cauda longa (segundos) | ≈ ilustrativo; o playground usa mediana de ~150 ms com grande dispersão |
| Disponibilidade publicada | muitas vezes 99,9%–99,99% | A sua disponibilidade efetiva inclui o caminho de rede até ela |
| Limites de taxa | de dezenas a milhares de requisições por segundo por conta | Excedê-los devolve 429 com Retry-After |
| Timeout sugerido | um pouco acima do p99 do provedor | por exemplo, p99 de 800 ms ⇒ timeout ≈ 1 s (≈ ilustrativo) |
Modos de falha.
- Respostas lentas esgotam suas threads e se propagam para cima (o clássico cenário
cascading-failure) → timeouts, circuit breaker, bulkhead (um pool separado por provedor). - Queda → fallback (dados em cache, uma funcionalidade degradada, um segundo provedor), enfileirar o trabalho para depois.
- Limite de taxa (429) → limitar a taxa do lado do cliente abaixo da cota, backoff respeitando o Retry-After, lotes, cache.
- Mudanças incompatíveis na API → fixar versões, testes de contrato, acompanhar avisos de descontinuação.
- Retry storms que pioram a queda do provedor e fazem você ser bloqueado → backoff exponencial com jitter, orçamento de retries.
No playground. thirdparty é um nó externo de chamada com grande variância de latência (lognormal, mediana de 150 ms com sigma alto), uma cota do provedor quota (padrão 1.000 req/s; requisições acima dela falham com 429) e quedas aleatórias mais frequentes que as dos nós internos. Proteja a aresta que o chama com timeoutMs, retries com backoff exp+jitter, circuitBreaker e um fallback. Cenários: cascading-failure, retry-storm.
Produtos reais.
- Não é uma categoria de produto: você chama terceiros a partir dos seus serviços. Peças úteis da AWS em volta deles: Amazon API Gateway / AWS AppSync para fazer proxy e cache, Amazon EventBridge API destinations para chamar APIs HTTP externas com limites de taxa e retries.
- Apigee — gestão de APIs que faz proxy, cache e limite de taxa de APIs de saída e de entrada.
- Application Integration / Integration Connectors — conectores gerenciados para APIs de SaaS comuns.
- Azure API Management — proxy, cache e políticas na frente de APIs externas.
- Azure Logic Apps — workflows com conectores para muitas APIs de SaaS.
- Resilience4j (Java) — timeouts, retries, circuit breakers e bulkheads em volta das chamadas de cliente (Hands-on 9).
- Toxiproxy — simula dependências lentas e falhando nos testes (Hands-on 9).
- WireMock — simula APIs HTTP de terceiros nos testes.
Na entrevista
"Toda chamada a terceiros ganha um timeout logo acima do p99, um circuit breaker e um pool de threads próprio, e fica atrás de uma interface de adaptador; se o usuário não precisa da resposta na hora, eu movo a chamada para uma fila, para que o dia ruim do provedor não vire o nosso."
Saiba mais: Computação › Integrações · Confiabilidade › Padrões · Estimativas › Matemática da disponibilidade · Hands-on 9
Payment
O que é. Um provedor de serviços de pagamento (PSP) cobra cartões, carteiras e pagamentos instantâneos em seu nome e transfere o dinheiro para a sua conta. Você nunca guarda números de cartão: o provedor entrega ao navegador um formulário hospedado ou tokeniza o cartão, e o seu backend só vê um token. O fluxo usual tem duas metades: uma requisição síncrona para criar ou confirmar um pagamento (que pode devolver "pendente") e um webhook assíncrono do provedor com o status final (aprovado, recusado, reembolsado, contestado). No Brasil, os pagamentos instantâneos via Pix seguem o mesmo formato: você cria uma cobrança (um QR code) e a confirmação chega como notificação.
Quando usar.
- Sempre, quando há dinheiro de verdade: processar cartões por conta própria significa escopo PCI DSS, contratos com adquirentes e tratamento de fraude.
- O serviço
paymentdo BoxOffice é um adaptador: ele esconde o provedor atrás de uma pequena API interna (authorize,capture,refund, tratador de webhook), para que o provedor possa ser trocado ou um segundo possa ser acrescentado.
Quando não usar (ou cuidado).
- Nunca trate um timeout como falha: a cobrança pode ter sido feita. Repita só com a mesma chave de idempotência, ou consulte o status do pagamento.
- Nunca confie no redirecionamento do navegador ("pagamento OK") como prova: confirme pelo webhook (verificando a assinatura) ou por uma consulta de status no servidor.
- Nunca mantenha uma transação de banco ou um lock de assento aberto enquanto espera o provedor: segure o assento com expiração (
hold_until), chame o provedor e depois confirme. - Nunca coloque dados de cartão em logs, eventos ou analytics.
Números-chave.
| Métrica | Valor típico | Observação |
|---|---|---|
| Latência da autorização | ≈ 0,5–3 s, com cauda longa | ≈ ilustrativo; desafios do 3-D Secure acrescentam o tempo do usuário |
| Atraso do webhook | segundos, às vezes minutos; reenviado pelo provedor por horas ou dias | Webhooks podem chegar atrasados, duplicados ou fora de ordem |
| Tarifas | um percentual mais um valor fixo por transação | Varia por país, meio de pagamento e contrato — confira com o provedor |
| Retenção da chave de idempotência | em geral pelo menos 24 horas do lado do provedor | por exemplo, a Stripe documenta 24 h; confira o seu |
| Reserva do assento durante o pagamento | ≈ 5–15 min | Uma decisão de produto; o BoxOffice usa 10 min |
Modos de falha.
- Cobrança em dobro — o cliente ou o seu serviço repete após um timeout sem chave de idempotência → uma chave de idempotência por tentativa de pagamento (por exemplo, derivada do id do pedido), guardada com o resultado.
- Webhook perdido, ou que chega antes de a linha do pedido existir → guarde os webhooks primeiro e processe de forma idempotente; um job de conciliação compara diariamente (ou de hora em hora) os seus pedidos com o relatório do provedor.
- Queda do provedor às 10:00 → circuit breaker, um estado "pagamento pendente" com a reserva do assento estendida, um segundo provedor para eventos críticos, comunicação clara.
- Estados inconsistentes — pago no provedor, mas o pedido foi cancelado localmente (ou o contrário) → uma saga com compensações (reembolsar, liberar o assento) e a conciliação como rede de segurança.
- Fraude e chargebacks → as ferramentas antifraude do provedor, limites de velocidade por usuário e por cartão, 3-D Secure.
No playground. payment é um nó externo de chamada com grande variância de latência (mediana de 400 ms), uma cota do provedor quota (padrão 500 req/s) e quedas aleatórias; o cenário payment-system mostra retries sem idempotência criando cobranças duplicadas, e o cenário flash-sale mostra o pagamento virando o gargalo quando a venda abre. Use timeoutMs, retries com exp+jitter, circuitBreaker e um fallback ("pagamento pendente") na aresta que vem de order. Cenários: payment-system, flash-sale, cascading-failure.
Produtos reais.
- Provedores de nuvem não são processadores de pagamento. Você chama um PSP a partir dos seus serviços; o AWS Payment Cryptography existe para empresas que constroem a própria infraestrutura de pagamentos (operações de chaves no estilo HSM), não para lojistas como o BoxOffice.
- O Google Pay é uma carteira que funciona por meio do seu PSP, não um processador que você integra sozinho. O Google Cloud não tem serviço de processamento de pagamentos para lojistas.
- O Azure não tem serviço de processamento de pagamentos para lojistas; você integra um PSP a partir dos seus serviços.
- O processamento de pagamentos em si nunca é auto-hospedado. Provedores reais: Stripe, Adyen, PayPal / Braintree, Mercado Pago, PagSeguro (PagBank) e o Pix por meio de PSPs e bancos brasileiros.
- Hyperswitch (Juspay) — orquestração de pagamentos de código aberto que roteia entre vários PSPs.
- Sandboxes e CLIs dos provedores (por exemplo, a Stripe CLI para encaminhar webhooks de teste) para desenvolvimento.
Na entrevista
"O pagamento passa por um adaptador com uma chave de idempotência por tentativa, timeout e circuit breaker; o status final vem de um webhook assinado processado de forma idempotente, o assento fica reservado com expiração em vez de lock, e um job de conciliação contra o relatório do provedor pega o que escapar."
Saiba mais: Computação › Integrações · Estudo de caso: sistema de pagamentos · Mensageria › Padrões · Hands-on 9
O que é. Um provedor de entrega de e-mail envia mensagens em seu nome por uma infraestrutura com reputação gerenciada e informa o que aconteceu (entregue, devolvido, marcado como spam) por webhooks ou eventos. Enviar é fácil; a entregabilidade é a parte difícil: autenticar o seu domínio (SPF, DKIM, DMARC), manter baixas as taxas de devolução e de reclamação, aquecer endereços de envio novos e respeitar os descadastramentos. E-mails transacionais (ingressos, recibos, redefinição de senha) e de marketing costumam ficar em fluxos separados, para que uma campanha ruim não prejudique a entrega dos ingressos.
Quando usar.
- Mensagens transacionais: o BoxOffice envia o ingresso e o recibo depois do
OrderConfirmed, redefinições de senha, avisos de mudança no evento. - Sempre de forma assíncrona: o pedido está confirmado quando o commit acontece, não quando o e-mail sai. Uma fila e os workers de
notificationfazem o envio.
Quando não usar (ou cuidado).
- Nunca envie e-mail dentro da transação de compra ou na thread da requisição: a latência e as quedas do provedor virariam as do usuário.
- Não opere seus próprios servidores de e-mail para envios em produção, a menos que esse seja o seu negócio: reputação de IP leva muito tempo para ser construída.
- Valem os limites de envio e as taxas por segundo do provedor: uma venda relâmpago que confirma 60.000 pedidos em 15 minutos dá ~67 e-mails por segundo, que precisam caber na cota da conta (peça aumentos com antecedência).
- E-mail não é garantido nem instantâneo; para avisos urgentes, combine canais (push, SMS) e mostre o ingresso no app.
Números-chave.
| Métrica | Valor típico | Observação |
|---|---|---|
| Chamada à API para aceitar uma mensagem | ≈ 50–300 ms | ≈ ilustrativo; a entrega na caixa de entrada leva de segundos a minutos |
| Cota de envio | específica da conta (por dia e por segundo) | Contas novas começam com cota baixa (sandbox) — planeje aumentos antes do lançamento |
| Preço | ≈ USD 0,10 por 1.000 e-mails (preço de tabela do Amazon SES) | ≈ aproximado (2026); outros variam |
| Taxa de devolução saudável | ≈ < 2–5% | Provedores podem pausar contas acima dos seus limites |
| Taxa de reclamação saudável | ≈ < 0,1% | As regras de remetentes em massa do Gmail e do Yahoo pedem ficar abaixo de 0,3% |
Modos de falha.
- Queda ou estrangulamento do provedor → a fila absorve; os workers repetem com backoff; um segundo provedor para os e-mails transacionais críticos.
- E-mails duplicados — entrega at-least-once da fila → consumidor idempotente com chave (id do pedido, modelo).
- Cair no spam → SPF/DKIM/DMARC, fluxos separados para transacional e marketing, higiene das listas.
- Mensagem venenosa (endereço inválido, erro no modelo) trava a fila → dead-letter queue após N tentativas, alertas.
- Perda silenciosa → acompanhar os eventos do provedor (entregue/devolvido) e oferecer "reenviar ingresso" no app.
No playground. email é um nó externo de chamada (mediana de 250 ms) com uma cota do provedor quota (padrão 100 envios/s) e quedas ocasionais; coloque-o atrás de nós queue e worker para que a latência e as falhas dele virem backlog, e não erros para o usuário. Cenários: notification-system, async-queue, flash-sale.
Produtos reais.
- Amazon SES (Simple Email Service) — e-mail transacional e em massa com eventos de envio (entregas, devoluções, reclamações).
- O Google Cloud não tem serviço próprio de envio de e-mails; parceiros como SendGrid (Twilio) ou Mailgun são usados a partir do GCP.
- Azure Communication Services Email — envio de e-mails gerenciado para aplicações.
- Postfix — o clássico agente de transferência de e-mails, se você realmente operar o seu.
- Mailpit / MailHog — servidores SMTP locais que capturam e-mails para desenvolvimento e testes (sem entrega real).
- Provedores comerciais comuns: SendGrid, Mailgun, Postmark, Resend.
Na entrevista
"E-mail nunca fica no caminho da requisição: o OrderConfirmed vai para uma fila, workers de notificação idempotentes enviam pelo provedor dentro do limite de taxa, as falhas são repetidas com backoff e terminam numa DLQ, e o ingresso também fica disponível no app caso o e-mail atrase."
Saiba mais: Computação › Integrações · Estudo de caso: sistema de notificações · Mensageria › Semântica · Computação › Notifications · Hands-on 7