Ao criar uma troca Direta, ela irá direcionar a mensagem para a fila que está ligada a ela.
Ok Julio, mas se eu tiver 2 filas nesta troca?
Pergunta boa meu amigo! 😉
Neste caso, a Chave de Roteamento tem efeito.
Chave de Roteamento é um atributo responsável por informar a troca para qual fila a mensagem deve ser direcionada.
Nota: A troca somente direcionará a mensagem recebida para filas que tenham chaves de roteamento exatamente iguais.
Nota 2: Se as filas vinculadas tiverem a mesma chave de roteamento, esta mensagem será direcionada para essas filas em paralelo.
Fanout
Não parecido com o tipo Direct, no fanout, não temos o índice de roteamento.
Quando uma troca de Fanout recebe uma mensagem, uma cópia desta mensagem é enviada para todas as filas vinculadas a ela.
Topic
Imagine que o Tópico é do tipo Direto mas com particularidade, os Padrões de Chaves de Roteamento.
No Tópico, é possível usar padrões para chaves de roteamento.
Estes padrões podem ser criados usando os caracteres * e #.
Ao criar um padrão de chaves de roteamento com #, estamos dizendo à troca que este # pode ser substituído por 0 ou n palavras.
Quando usamos *, estamos dizendo para troca que * só pode ser substituído por 1 palavra.
Por isso, quando uma troca do tipo Tópico recebe uma mensagem, ela irá verificar a Chave de Roteamento da mensagem, comparar com as Chaves de Roteamento das filas e enviar uma cópia dessa mensagem para todas as filas em que as Chaves de Roteamento (mensagem e fila) se combinam.
Exemplo:
>
Chave de Roteamento de Mensagens: routing.key.test
No caso acima, a mensagem será enviada para as filas 1, 3 e 4. Ela não será enviada para 2 porque o padrão requer que haja apenas uma palavra após “routing” e no nosso caso, há 2.
Headers
Antes de explicar esta troca, é necessário informar que é possível enviar atributos no cabeçalho de uma mensagem (similar ao cabeçalho do HTTP)
A troca de Headers é similar ao Topic, mas ao invés de comparar a Chave de Roteamento, ela compara os atributos presentes no cabeçalho da mensagem com os atributos presentes nos argumentos definidos quando ligamos uma fila em troca.
É possível criar uma regra para esta validação.
Para criar esta regra, usamos o argumento com a chave “x-match” com 2 valores possíveis: qualquer um e todos.
Any é comparável a |||de uma condição e todos são comparáveis a &&.
Exemplo:
Quando enviamos uma mensagem com o argumento {“chave1”: “value1”} no cabeçalho da mesma, esta mensagem será dirigida apenas para a fila “headers.queue1” porque existe o atributo {“key1”: “value1”} nos argumentos desta fila.
No caso da fila “headers.queue2”, a troca será validada se o cabeçalho da mensagem contiver os 2 argumentos uma vez que o “x-match” está definido para todos. Portanto, a troca não irá encontrar a {“chave2”: “value2”} no cabeçalho da mensagem e não irá direcionar uma cópia dessa mensagem para aquela fila.
Espero que esta rápida explicação possa ajudá-lo a entender as trocas RabbitMQ.
Para saber mais: https://www.rabbitmq.com/tutorials/amqp-concepts.html
Junte-se à nossa comunidade Slack e leia os nossos tópicos de Faun semanais ⬇