Skip to content

🐇 Publish/Subscribe #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 10, 2024
Merged

🐇 Publish/Subscribe #2

merged 2 commits into from
Sep 10, 2024

Conversation

lucasgianine
Copy link
Owner

@lucasgianine lucasgianine commented Sep 10, 2024

Publish/Subscribe

Dessa vez iremos entregar uma mensagem para vários consumidores, criaremos um registro simples com dois programas, onde um emitirá mensagens de registro e outro que vai receber e imprimir, no nosso programa, cada cópia em execução do receptor receberá as mensagens, onde o receptor poderá se comunicar com os dois queues ao mesmo tempo.

Toda ideia do Rabbit é que, na verdade o producer nunca envie mensagem diretamente para fila (pois na realidade é que o producer nem sabe se a mensagem chegará até lá), mas ao invés disso ele envie mensagens para uma exchange, pois ela sabe exatamente o que fazer com a mensagem que recebeu para empurrá-lá para uma queue.

flowchart LR
  P["Producer"]
  X{"Exchange"}
  Q1["Queue 1"]
  Q2["Queue 2"]

  P --> X --> Q1
  X --> Q2
Loading

Há alguns tipos de exchanges, mas vamos trabalhar em cima do fanout: Ela transmite todas as mensagens que recebe para todas as filas que ela tem conhecimento.

  channel.assertExchange('logs', 'fanout', { durable: false })

Filas temporárias

Dar o nome para uma fila é importante para compartilharmos ela entre os produces e consumers, mas no caso dessa aplicação de logs, não precisamos criar uma fila permanente, deixaremos o nome da fila vazio para que o próprio servidor possa dar um nome aleatório, já que nesse momento isso não é prioritário visto que a fila, depois de ser consumida, deverá ser apagada automaticamente.

  channel.assertQueue('', {
    exclusive: true
  })

  // Exemplo de retorno: amq.gen-JzTY20BRgKO-HjmUJj0wLg

Depois de todo o processo de criar exchange e as filas temporárias agora vamos fazer nossa exchange enviar mensagem para a fila.

flowchart LR
  P["Producer"]
  X{"Exchange"}
  Q1["Queue 1"]
  Q2["Queue 2"]

  P --> X -- Binding --> Q1
  X -- Binding --> Q2
Loading

Chamamos de binding o relacionamento entre exchange (troca) e uma queue (fila).

  channel.bindQueue(queue_name, 'logs', '')

@lucasgianine lucasgianine self-assigned this Sep 10, 2024
@lucasgianine lucasgianine merged commit d484019 into main Sep 10, 2024
@lucasgianine lucasgianine deleted the publish-subscribe branch September 10, 2024 20:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant