Pular para o conteúdo principal

Scatter-Gather

Descrição​

O Scatter-Gather envia uma requisição a vários destinatários e usa um Aggregator para coletar as respostas e combiná-las em uma só. O exemplo clássico é um item sem estoque que pode ser obtido de vários fornecedores, cada um com preço e prazo diferentes: pede-se cotação a todos e escolhe-se a melhor.

Há duas variantes. Na de distribuição, uma Recipient List envia a requisição a uma lista controlada, o que dá controle sobre os destinatários, mas exige conhecer o canal de cada um. Na variante de leilão, um canal publish-subscribe difunde a requisição a quem estiver interessado, usando um único canal e cedendo parte do controle.

Problemas que resolve​

  • Vários destinatários devem ser consultados em paralelo para comparar ofertas
  • As respostas chegam em tempos diferentes e algumas podem não chegar
  • O chamador precisa de uma única resposta, não de um fluxo de respostas parciais

Quando usar​

  • Cotações, leilões e consultas a várias fontes redundantes
  • Quando a latência total deve ser a do mais lento (ou do primeiro) e não a soma
  • O número de destinatários pode ser fixo ou calculado em tempo de execução

Quando evitar​

  • Há um único destino; use um roteador comum
  • Não se tolera tráfego multiplicado ou os destinatários têm custo por consulta alto
  • Não há critério claro para combinar ou escolher respostas

Trade-offs​

GanhoCusto / Risco
Resposta consolidada e melhor escolhaMais tráfego e consumo de recursos nos destinatários
Paralelismo reduz a latência totalDecidir quando parar de esperar
Distribuição dá controle; leilão dá flexibilidadeDistribuição acopla aos canais; leilão perde controle
  • Erros por rota: uma rota que falha pode sinalizar falha geral ou apenas ser ignorada, conforme o caso.
  • Completude: reutilize as estratégias do Aggregator (timeout, primeira resposta etc.).

Diagrama​

A requisição é espalhada aos fornecedores e as respostas são reunidas em um único resultado.

Padrões relacionados​

Referência​