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.
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.
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.
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.
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);
});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.
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.