Message Channel

TL;DR

O Message Channel é o caminho lógico por onde a mensagem trafega — o emissor escreve no canal, o receptor lê do canal, e nenhum dos dois conhece o outro (é o canal que desacopla). A decisão central é o tipo de canal, e ela define quantos recebem cada mensagem: Point-to-Point (uma fila — cada mensagem é consumida por exatamente um receptor, mesmo havendo vários competindo) × Publish-Subscribe (um tópico — cada mensagem é entregue a todos os assinantes). Escolher errado é o bug de integração mais comum: mandar um comando por pub-sub (N sistemas executam a mesma ação) ou um evento por fila (só um dos interessados fica sabendo). Variantes: Datatype Channel (um canal por tipo), Invalid Message Channel e Dead Letter Channel (para onde vai o que não pôde ser processado).

O canal é quem desacopla

No estilo messaging, o produtor não chama o consumidor — ele deposita a mensagem num canal e segue a vida. O consumidor, em outro ritmo, lê do canal. Essa indireção é a fonte de todo o desacoplamento: o produtor não sabe quem consome, quantos consomem, nem quando. Trocar, adicionar ou remover consumidores não toca no produtor.

Mas “um canal” é uma decisão com duas geometrias radicalmente diferentes, e escolher entre elas é a primeira pergunta de qualquer integração assíncrona: essa mensagem deve ser processada por um só, ou anunciada a todos?

Point-to-Point × Publish-Subscribe


graph TD
    subgraph PP["Point-to-Point (fila)"]
        S1["Produtor"] --> Q["fila"]
        Q --> C1["Consumidor A"]
        Q -.uma mensagem<br/>vai a UM só.-x C2["Consumidor B"]
    end
    subgraph PS["Publish-Subscribe (tópico)"]
        S2["Produtor"] --> T["tópico"]
        T --> D1["Assinante 1"]
        T --> D2["Assinante 2"]
        T --> D3["Assinante 3"]
    end

    style Q fill:#4A90D9,color:#fff
    style T fill:#F5A623,color:#000
  • Point-to-Point Channel (fila): garante que exatamente um consumidor processa cada mensagem. Se houver vários consumidores na fila, eles competem (11 - Competing Consumers) e o canal entrega cada mensagem a apenas um — ótimo para distribuir trabalho (uma tarefa, um worker). Casa com Command Message: uma ordem deve ser executada uma vez.
  • Publish-Subscribe Channel (tópico): entrega uma cópia a cada assinante. Ótimo para anunciar fatos a múltiplos interessados que reagem de formas diferentes. Casa com Event Message: um fato interessa a quem quiser ouvir.

A regra prática: trabalho a distribuir → fila; fato a anunciar → tópico. Ela decorre direto da intenção da mensagem (comando × evento).

Variantes que organizam e protegem o canal

  • Datatype Channel — um canal por tipo de mensagem. Como o consumidor lê sem negociar o formato, ele precisa saber de antemão o que vem; misturar tipos num canal força o consumidor a inspecionar e ramificar (e é a primeira armadilha abaixo).
  • Invalid Message Channel — para onde vai a mensagem que chegou malformada (não desserializa, viola o contrato). Em vez de travar o consumidor, ela é desviada para análise.
  • Dead Letter Channel — para onde o sistema de mensageria coloca a mensagem que não conseguiu entregar (destino inexistente, expirada, rejeitada N vezes). É a rede de segurança da confiabilidade, aprofundada em 13 - Guaranteed Delivery + Dead Letter Channel.

A lente cross-ferramenta

TecnologiaPoint-to-PointPublish-Subscribe
JMSQueueTopic
RabbitMQ (AMQP)exchange default → queuefanout/topic exchange → N queues
Kafkatópico + um consumer grouptópico + vários consumer groups
AWSSQSSNS (→ SQS/e-mail/HTTP)

O Kafka é o caso instrutivo: um mesmo tópico é point-to-point dentro de um consumer group (a partição vai a um consumidor do grupo) e publish-subscribe entre grupos (cada grupo recebe tudo). Ele unifica as duas geometrias na mesma primitiva — por isso “tópico Kafka” ≠ “tópico JMS”.

Armadilhas comuns

Misturar tipos de mensagem num canal

O que acontece: um canal eventos recebe PedidoCriado, PagamentoAprovado e ClienteAtualizado juntos; todo consumidor precisa inspecionar o tipo e ramificar, ignorando o que não lhe interessa. Por quê: viola o Datatype Channel. O consumidor não pode mais assumir o formato do que lê; acopla-se a todos os tipos que trafegam ali, e uma mudança em qualquer um pode afetá-lo. Como evitar: um canal por tipo (ou por contexto coeso). Se precisa multiplexar, use um Content-Based Router na entrada para separar por tipo em canais dedicados — não empurre a ramificação para cada consumidor.

Comando por publish-subscribe

O que acontece: publica-se CobrarCliente num tópico; todos os assinantes executam a cobrança — o cliente é cobrado três vezes. Por quê: pub-sub entrega a todos. Um comando deve ser executado uma vez — o canal errado transforma “faça isto” em “todos façam isto”. Como evitar: comandos vão por fila (point-to-point, exatamente um executor); reserve pub-sub para eventos (fatos que múltiplos podem observar sem duplicar efeito).

Evento por fila única (interessado perdido)

O que acontece: o fato PedidoPago é publicado numa fila; o primeiro consumidor a pegar processa, e os outros sistemas interessados nunca ficam sabendo. Por quê: fila entrega a um só. Um fato que interessa a vários exige que cada um receba sua cópia — a fila única rouba a mensagem dos demais. Como evitar: eventos com múltiplos interessados vão por tópico (pub-sub). Se cada sistema tem sua própria fila alimentada pelo tópico (o padrão SNS→SQS), cada um processa de forma independente e resiliente.

Como explicar em inglês

“A Message Channel is the logical path a message travels — the producer writes to the channel, the consumer reads from it, and neither knows the other; the channel is what decouples them. The key decision is the channel type, which decides how many receive each message. A Point-to-Point channel — a queue — delivers each message to exactly one consumer, even when several compete, so it’s for distributing work and pairs with command messages. A Publish-Subscribe channel — a topic — delivers a copy to every subscriber, so it’s for announcing facts and pairs with event messages. The rule is: work to distribute goes on a queue, a fact to announce goes on a topic. Kafka is the instructive case — a topic is point-to-point within a consumer group and publish-subscribe across groups. The classic bugs are sending a command over pub-sub, so everyone executes it, and sending an event over a single queue, so only one interested system ever hears about it.”

PTEN
canal de mensagensmessage channel
ponto-a-ponto (fila)point-to-point (queue)
publicação-assinatura (tópico)publish-subscribe (topic)
canal por tipo de dadodatatype channel
canal de mensagem inválidainvalid message channel
distribuir trabalhodistribute work
grupo de consumidoresconsumer group

O que vem a seguir

Temos a mensagem (02) e o canal (03). Falta a metáfora que conecta os canais em processamento: se cada etapa de tratamento é um filtro e cada canal é um pipe, então integrações complexas viram pipelines componíveis — e é isso que faz todos os roteadores e transformadores das próximas notas se encaixarem.

Veja também

Fontes