Orquestração vs Coreografia
Dois jeitos de coordenar serviços em sistemas distribuídos: com um maestro no comando ou com cada serviço dançando no ritmo dos eventos.
Maestro vs Dança de salão
Na orquestração, existe um maestro que diz a cada músico quando tocar — ele controla tudo. Na coreografia, é como uma dança de salão: cada par ouve a música e segue o ritmo por conta própria, sem ninguém dizendo o que fazer. A coordenação emerge naturalmente.
Orquestração: coordenação centralizada
Um serviço central (orquestrador) coordena todo o fluxo, chamando cada serviço na ordem certa. É mais fácil de entender e debugar, mas o orquestrador vira um ponto único de falha e pode virar gargalo.
Coreografia: coordenação por eventos
Cada serviço publica eventos e reage aos eventos dos outros. Não existe um controlador central. É mais resiliente e desacoplado, mas o fluxo fica espalhado e pode ser difícil de rastrear.
Fluxo de pedido com orquestração
O orquestrador chama cada etapa em sequência:
// Orquestrador de Pedido
async function processarPedido(pedido) {
await servicoPagamento.cobrar(pedido);
await servicoEstoque.reservar(pedido.itens);
await servicoEntrega.agendar(pedido.endereco);
await servicoNotificacao.enviarConfirmacao(pedido.cliente);
}Fluxo de pedido com coreografia
Cada serviço reage a eventos independentemente:
// Serviço de Pagamento
eventBus.on('PedidoCriado', async (pedido) => {
await cobrar(pedido);
eventBus.emit('PagamentoConfirmado', pedido);
});
// Serviço de Estoque
eventBus.on('PagamentoConfirmado', async (pedido) => {
await reservar(pedido.itens);
eventBus.emit('EstoqueReservado', pedido);
});
// Serviço de Entrega
eventBus.on('EstoqueReservado', async (pedido) => {
await agendar(pedido.endereco);
});Sagas: compensando falhas
Em ambos os modelos, usamos Sagas para lidar com falhas. Se uma etapa falha, executamos ações compensatórias para desfazer as anteriores — como cancelar a cobrança se o estoque não tiver o produto.