Como funciona o RabbitMQ? - Full Cycle FullCycle

Voltar

Wesley Willians

Como funciona o RabbitMQ?

13 min de leitura

O RabbitMQ é um message broker altamente consolidado e utilizado por quem trabalha com comunicação entre sistemas. Operando de forma assíncrona, ele age como um intermediário que processa as nossas mensagens entre produtores e consumidores, além de contar com filas que possuem diversas opções de encaminhamento.

 

Você pode aplicar essas funcionalidades ao seu e-commerce, por exemplo, utilizando as mensagens como uma forma de manipular, processar e encaminhar os seus pedidos de vendas para os sistemas de outros setores, como distribuição e emissão de notas fiscais.

No processamento de pedidos é possível encaminhar a mensagem das suas vendas para o centro de distribuição e para uma área de notas fiscais. Nesse esquema tudo funciona de forma horizontal, seguindo o padrão assíncrono no envio de mensagens, mas muitas vezes é possível enviar uma ação para diversas filas.

Seguindo o exemplo anterior, essa função pode ser muito útil quando o cliente realiza uma compra e o produto precisa ser preparado para as áreas de distribuição, transporte e notas fiscais. E como cada um desses setores é um sistema diferente, o objetivo do RabbitMQ é encaminhar todas essas mensagens para os sistemas correspondentes.

Vamos entender melhor essa dinâmica conhecendo os tipos de exchanges, representando basicamente a troca de mensagens.

Tipos de Exchange:

Pelas exchanges, sempre que nós enviamos uma mensagem via RabbitMQ, nós não mandamos diretamente para uma fila, para outros sistemas já lerem, nós mandamos para uma exchange, que é responsável por encaminhar as mensagens para diversas filas.

Os tipos de exchanges são: Direct, Fanout, Topic e Readers.

— Direct Exchange

Para exemplificar, vamos imaginar que um producer precisa emitir uma mensagem de confirmação de compra para três consumers. Ou seja, o sistema precisa se comunicar com outros três diferentes sistemas para efetuar a compra.

Como o RabbitMQ envia a mensagem separadamente para cada fila, existe uma dinâmica para fazer com que esses outros sistemas recebam a mensagem diretamente.

Normalmente a exchange encaminha a mensagem para as filas, mas muitas vezes nós não queremos que as nossas mensagens sejam enviadas para todas as filas. Por isso existem diversas condições que nós podemos aplicar para fazer com que uma exchange funcione.

Então você tem a possibilidade de fazer com que a sua mensagem seja enviada para um consumer, apenas; ao invés de ser enviada para todos.

Binding Key

Para conectar uma fila a uma exchange é preciso criar um bind, que é basicamente uma relação entre uma fila e uma exchange, como um de conector.

Routing Key

Nesse bind nós também podemos criar um elemento chamado routing key, que em outras palavras é uma chave para encaminhar as nossas mensagens para uma fila específica.

Se você tem uma routing key X, uma routing key Y e uma routing key Z; a mensagem que estiver com a routing key Y, por exemplo, passará pela fila Y e será entregue diretamente ao consumidor que você definiu para receber a mensagem.

Dessa forma nós podemos ter diversas filas conectadas a uma exchange, mas ao mesmo tempo elas também podem ter relações diferentes com as exchanges utilizando as routing keys.

Essa é a ideia, basicamente, quando nós trabalhamos com exchanges do tipo Direct. Nós adicionamos a routing key e a mensagem é enviada diretamente para o ponto que nós queremos.

— Fanout Exchange

Quando a mensagem é enviada para a exchange, ela é enviada para todas as filas ligadas a ela. Então se você tem 10 filas ligadas a uma exchange do tipo fanout, todas as filas irão receber a mensagem que foi enviada.

O Fanout é basicamente isso: você tem uma mensagem e quer que ela se espalhe.

— Topic Exchange

Essa é uma das exchanges mais flexíveis, que nos permite enviar as mensagens de acordo com o assunto. E com base na forma que você nomeia as routing keys é possível criar padrões de regras e relações entre os sistemas.

Por exemplo: routing key (x.*); routing key (*.z); routing key (*.y.*).

Então se o nosso sistema é de compras e nós precisamos enviar uma mensagem para a exchange, é possível criar uma condição baseada na routing key para que somente as filas ou sistemas similares recebam a mensagem.

Nesse caso, se nós enviarmos uma mensagem chamada (x.log), somente a fila referente a esse tópico irá receber a mensagem por conta do padrão que nós criamos. Ou se você enviar uma mensagem (t.z), somente a exchange relativa a essa chave irá recebê-la.

Por isso a Topic Exchange possui uma relação bastante flexível para encaminhar as nossas mensagens. Já o tipo Direct é aquele que você adiciona a routing key específica para o exato ponto que você quer, num padrão mais singular.

Simulador

Você pode simular todas essas relações sem utilizar código pelo site tryrabbitmq.com caso você tenha dúvidas sobre comportamento das exchanges. Alguns podem até pensar que o Kafka é mais simples porque ele só utiliza um tópico, que pode ser lido e consumido por várias pessoas; mas o RabbitMQ é mais simples do que parece.

A Full Cycle utiliza o RabbitMQ para todas as comunicações da empresa. E, conforme o aluno executa uma operação na nossa plataforma principal, essa ação é intermediada pelo RabbitMQ e nós podemos decidir o que fazer porque diversos sistemas podem consumir de acordo com as regras que nós estabelecemos.

No geral o RabbitMQ é um sistema fácil de se entender e conta com diversas formas de trabalhar com as suas dinâmicas de funcionamento, para tratar as mensagens e sistemas destinatários. Recomendamos que você faça alguns testes utilizando o simulador para que tudo fique um pouco mais simples.

Caso ainda tenha dúvidas sobre o RabbitMQ, confira nosso outro post sobre o assunto.

E você já conferiu o conteúdo do nosso canal?

Se você curtiu esse conteúdo e quer aprender mais sobre RabbitMQ, solicite contato clicando aqui e nós te ajudamos.