VapVup👤
← Voltar
📡

Publish/Subscribe (Pub/Sub)

Pub/Sub é um padrão de mensageria onde quem publica mensagens não precisa saber quem as consome. Isso cria um desacoplamento poderoso entre serviços.

📰Analogia

A Newsletter do Jornal

O jornal publica a edição do dia sem saber exatamente quem vai ler. Os assinantes recebem automaticamente sem precisar ir até a redação. Ninguém se conhece, mas a informação flui. Isso é Pub/Sub.

💡Conceito

Desacoplamento Total

O publisher não conhece os subscribers e vice-versa. Isso significa que você pode adicionar novos consumidores sem alterar quem publica, e o publisher continua funcionando mesmo se um subscriber cair.

💡Conceito

Tópicos e Fanout

Mensagens são publicadas em tópicos. Cada subscriber se inscreve nos tópicos de interesse. Fanout significa que uma mensagem publicada é entregue a todos os subscribers daquele tópico simultaneamente.

🔧Exemplo

Sistema de Notificações

Quando um pedido é confirmado, um evento é publicado. Diferentes serviços reagem independentemente: um envia e-mail, outro SMS, outro atualiza o dashboard — sem que o serviço de pedidos saiba de nenhum deles.

// Publisher: serviço de pedidos
async function confirmarPedido(pedido) {
  await salvarPedido(pedido);
  await messageBroker.publish('pedido.confirmado', {
    pedidoId: pedido.id,
    clienteEmail: pedido.email,
    valor: pedido.total
  });
}

// Subscriber 1: serviço de e-mail
messageBroker.subscribe('pedido.confirmado', async (msg) => {
  await enviarEmail(msg.clienteEmail, 'Pedido confirmado!');
});

// Subscriber 2: serviço de analytics
messageBroker.subscribe('pedido.confirmado', async (msg) => {
  await registrarMetrica('pedidos_confirmados', msg.valor);
});
📻Analogia

Rádio FM

A rádio transmite para todos que estão sintonizados na frequência. Ela não sabe quantos ouvintes tem. Novos ouvintes podem sintonizar a qualquer momento sem a rádio precisar fazer nada diferente.

💡Conceito

Quando Usar Pub/Sub

Use quando múltiplos serviços precisam reagir ao mesmo evento, quando o publisher não deve depender dos consumidores, ou quando você quer adicionar novos comportamentos sem modificar código existente.