Padrões de integração no Mule: catálogo
- 7 min de leitura
Nesta página
Código
Esta página liga cada padrão do livro Enterprise Integration Patterns (Hohpe e Woolf) ao componente ou recurso do Mule 4 que o implementa. Ela também aponta a página da série que explica o padrão com um exemplo que roda. O porquê da série está no artigo Padrões de integração no Mule: você já usa, só não sabe o nome.
As seções seguem os grupos do livro. A pergunta de cada linha resume o problema do padrão a partir da página dele no site do livro.
Canais: por onde a mensagem passa
| Padrão | Pergunta que ele responde | No Mule | Página |
|---|---|---|---|
| Como garantir que um único receptor consuma cada mensagem? | Fila do Anypoint MQ, no broker. As filas do VM Connector também entregam cada mensagem a um só consumidor, mas vivem dentro do runtime do Mule e não substituem um broker | Em breve | |
| Como entregar o mesmo evento a todos os interessados? | Message exchange do Anypoint MQ (o recurso do broker, não o Anypoint Exchange dos assets), que, sem regras de roteamento nos bindings, copia cada mensagem para todas as filas ligadas a ela | Publish-subscribe | |
| O que fazer com a mensagem que não pode ser entregue? | Dead letter queue do Anypoint MQ: depois de um número de tentativas de entrega sem confirmação (10 por padrão), o broker move a mensagem para a DLQ da fila | Dead letter channel | |
| O que fazer com a mensagem que chega, mas não faz sentido para o receptor? | Sem componente próprio; um tratamento de erro que manda a mensagem para uma fila separada da DLQ, porque tentar de novo não vai consertá-la | Em breve | |
| Como não perder a mensagem se o sistema de mensagens cair? | Filas do Anypoint MQ; filas VM persistentes, que não existem no CloudHub 2.0 nem no Runtime Fabric; o padrão de confiabilidade da documentação do Mule | Em breve | |
| Como ligar uma aplicação ao sistema de mensagens? | O papel dos conectores (Database, Salesforce, SFTP…) | Em breve |
Construção da mensagem: o que ela carrega
| Padrão | Pergunta que ele responde | No Mule | Página |
|---|---|---|---|
| Como receber uma resposta numa troca por mensagens? | HTTP Request; operação Publish Consume do VM | Em breve | |
| Como quem responde sabe para onde mandar a resposta? | A fila temporária de resposta que o Publish Consume do VM cria e descarta sozinho | Em breve | |
| Como saber a que requisição uma resposta pertence? | Um ID levado na requisição e devolvido na resposta. O correlationId do Mule faz um papel parecido entre aplicações: o HTTP Request o envia no header X-CORRELATION-ID, o listener da aplicação chamada o adota, e os logs das duas mostram o mesmo ID |
Correlation identifier | |
| Como indicar que uma mensagem ficou velha e não deve mais ser processada? | O tempo de vida (TTL) da fila do Anypoint MQ, de no máximo duas semanas | Em breve |
Roteamento: para onde a mensagem vai
| Padrão | Pergunta que ele responde | No Mule | Página |
|---|---|---|---|
| Como mandar cada mensagem ao destino certo a partir do conteúdo? | Choice | Em breve | |
| Como descartar as mensagens que não interessam? | Um Choice em que só a rota das mensagens aceitas tem processamento. O Choice não encerra o flow: o que vier depois dele roda para todas as mensagens, inclusive as descartadas | Em breve | |
| Como processar uma mensagem que traz vários itens? | For Each, Parallel For Each | Em breve | |
| Como juntar mensagens relacionadas numa só? | O módulo Aggregators, com agregadores por tamanho, por tempo e por grupo; a agregação do Scatter-Gather | Em breve | |
| Como enviar a vários destinos e juntar as respostas? | Scatter-Gather. Se uma rota falha, ele lança MULE:COMPOSITE_ROUTING com os erros e os resultados das rotas que deram certo |
Em breve | |
| Como conduzir uma mensagem por vários passos quando eles podem não ser conhecidos de antemão nem sequenciais? | Sem componente próprio. Um flow que guarda o estado do processo (num object store ou banco, quando o processo atravessa mais de uma execução) e decide o próximo passo a partir dos resultados intermediários | Em breve |
Transformação: o que muda no conteúdo
| Padrão | Pergunta que ele responde | No Mule | Página |
|---|---|---|---|
| Como sistemas com formatos diferentes trocam dados? | Transform Message (DataWeave) | Em breve | |
| Como lidar com uma mensagem grande quando só alguns campos interessam? | Transform Message selecionando ou removendo campos. O Message Filter descarta a mensagem inteira; o Content Filter enxuga o conteúdo | Em breve | |
| Como reduzir as dependências entre aplicações com formatos diferentes? | Sem componente; um modelo comum entre as APIs | Em breve | |
| Como completar uma mensagem que não traz todos os dados? | A target variable de uma operação guarda o dado buscado sem apagar o payload; um DataWeave junta os dois | Em breve | |
| Como reduzir o volume de dados que viaja na mensagem sem perder informação? | Sem componente; Object Store ou armazenamento externo, com só a chave viajando na mensagem | Em breve |
Endpoints: como a aplicação recebe e consome
| Padrão | Pergunta que ele responde | No Mule | Página |
|---|---|---|---|
| Como consumir mensagens assim que elas chegam? | As fontes de evento: HTTP Listener, VM Listener, Subscriber do Anypoint MQ | Em breve | |
| Como consumir uma mensagem quando a aplicação estiver pronta? | Um Scheduler seguido de uma leitura; a operação Consume do VM e do Anypoint MQ | Em breve | |
| Como processar várias mensagens da mesma fila ao mesmo tempo? | Os consumidores concorrentes do listener VM (4 por padrão), ou várias réplicas na mesma fila | Em breve | |
| Como receber a mesma mensagem duas vezes sem efeito dobrado? | Idempotent Message Validator, com uma chave de negócio no idExpression |
Idempotent receiver | |
| Como controlar a transação com o sistema de mensagens? | Transações iniciadas na fonte do evento ou num Try | Em breve |
Onde a coluna “No Mule” diz “sem componente próprio”, o padrão continua valendo, mas é você quem o monta com flows, configuração e uma decisão de projeto.
O exemplo que acompanha a série
O cenário é sempre o mesmo: um pedido que passa por pagamento, estoque e nota fiscal. Os padrões que rodam dentro do Mule têm exemplo executável no repositório mulesoft-patterns-examples, em src/main/mule/eip/<padrão>/, cada um com sua suíte MUnit e sem sistemas externos. Os que dependem do Anypoint MQ, como o message exchange e a DLQ, são explicados na página com a configuração do broker, a partir da documentação, porque não rodam sem ele.
git clone https://github.com/brunosouzas/mulesoft-patterns-examples.git
cd mulesoft-patterns-examples
mvn clean test
O MUnit roda no runtime Enterprise, então o Maven precisa de acesso ao repositório Enterprise da MuleSoft (credenciais no ~/.m2/settings.xml).