Pular para o conteúdo

apps/service-design/ambassador

156 · Padrões de Design de Serviço · ≈ 6 min de estudo

Ambassador

Um proxy ao lado do serviço cuida das chamadas de saída: injeta credencial, aplica timeout, repete tentativas com segurança e isola o destino que está falhando. O serviço chama localhost como se fosse o destino e não tem uma linha de retry ou autenticação. Aqui o ambassador é um Envoy, como em produção. Use quando vários serviços falam com os mesmos destinos externos e a resiliência não deve ser reimplementada em cada um.

passos
6
arquivos
4
testes
0
tecnologias
5
Infraestrutura realTypeScriptBunElysiaEnvoyDocker
Baixar cartão

Cenário

O serviço de pagamentos liquida TEDs no BACEN e registra na câmara. O BACEN falha às vezes na primeira tentativa, exige token e, num incidente, sai do ar. O serviço não sabe nada disso: o Envoy ao lado dele resolve credencial, retry, prazo e isolamento do destino.

Planta

Sequência
9/9
POST /bacen/ted-settle (sem credencial)1+ Authorization, x-request-id, timeout 1 s por tentativa25033retry com o mesmo x-request-id4200 protocolo (liquidado uma vez)52006POST /clearing/register7+ Authorization820093 x 5xx seguidos ejetam o destino: 503 imediato, sem tentar conectarServico de pagamentosEnvoy (ambassador, localhost:10000)BACEN STRCamara de registro
9

9 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Cliente remoto encapsulado em proxy.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

x-request-id+2
request_headers_to_add+1
retry_policy+1
outlier_detection+1
/stats+1
  1. 01

    O serviço chama http://localhost:10000/bacen/...; o Envoy reescreve o caminho e envia ao destino real

  2. 02

    request_headers_to_add injeta o Authorization de cada destino — a credencial nunca passa pelo código do serviço

  3. 03

    retry_policy repete em 5xx, reset e falha de conexão (2 retries, 1 s por tentativa, 3 s no total); o x-request-id gerado pelo Envoy é o mesmo em toda tentativa, e o destino liquida uma vez só

  4. 04

    outlier_detection ejeta o destino após 3 respostas 5xx seguidas; com o pânico desligado, o Envoy responde no healthy upstream em ~1 ms em vez de esperar

  5. 05

    Os contadores de retry, timeout e ejeção ficam no admin do Envoy (/stats), não no serviço

  6. 06

    Os destinos (BACEN e câmara) são simulados em Elysia no host; o Envoy os alcança por host.docker.internal

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Resiliência e credencial fora do código, iguais para todo serviço

  • Configuração declarativa, trocável sem redeploy do serviço

  • Retry seguro com id de requisição estável

  • Destino falhando isolado sem derrubar o chamador

Custos

  • Um processo a mais por serviço para operar

  • Salto extra em localhost em toda chamada

  • Retry só é seguro se o destino deduplica pelo id

  • Comportamento espalhado entre código e YAML exige documentação

apps/service-design/ambassador

4 arquivos

envoy/

  • envoy.yamlinfraO ambassador: rotas, credencial, retry, timeout, ejeção

src/

  • service_payments.tsServiço de pagamentos — só chama o localhost
  • destination_external.tsBACEN e câmara simulados: token, idempotência por x-request-id, plano de falhas
  • stats_envoy.tsLeitura dos contadores do admin do Envoy

Executar · com Docker

  1. ./docker.sh up# sobe Envoy
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
Envoy

Por que se relacionam

Teste rápido

Qual destes combina com Ambassador?

Próximo projeto · Padrões de Design de ServiçoAdapter
Esc

↑ ↓ navegarEnter abrir191 resultados