Skip to content

Instantly share code, notes, and snippets.

@viniciusjssouza
Created June 30, 2020 20:49
Show Gist options
  • Select an option

  • Save viniciusjssouza/453d6ac6180b9b5312f141c15e7e58cd to your computer and use it in GitHub Desktop.

Select an option

Save viniciusjssouza/453d6ac6180b9b5312f141c15e7e58cd to your computer and use it in GitHub Desktop.
AMQP model

RabbitMQ (AMQP) model

AMQP

Protocolo aberto da camada de aplicação para comunicação entre clientes e brokers de mensagens. Executa sobre o TCP, com payloads binários.

Entidades envolvidas

  • publisher: processo que publica mensagens;
  • exchange: "mailboxes" onde as mensagens são publicadas;
  • queue: fila de destino das mensagens;
  • broker: responsável por rotear cópias das mensagens publicadas a uma exchanges para todas as queues que vinculadas a essa exchange.
  • consumer: um ou mais processos que consomem as mensagens de uma queue;
  • connection: representa uma conexão TCP com o broker. Tanto a conexão de publisher quanto a do consumer são bi-direcionais;
  • channel: abstrai uma conexão entre o publisher e uma exchange. Vários channels podem ser abertos sobre a mesma conexão TCP para evitar consumo de recursos do SO.

Messages

Atributos de uma mensagem:

  • Routing Key (opcional): uma string usada no roteamento da mensagem;
  • Payload;
  • Content-type;
  • Encoding;
  • Durabilidade da entrega (persistente ou não);
  • timestamp da publicação;
  • prioridade (para filas de prioridade);

Exchanges

Atributos importantes de uma exchange:

  • name;
  • durability (sobreviver ou não a restarts do broker);
  • auto-delete (indica se a exchange deve ser deletada se não houver mais filas associdadas);

AMQP suporte 4 tipos de exchanges:

  • Direct

    • roteia mensagens de acordo com a routing key
    • comunicação unicast
    • Algoritmo: quando uma fila se vincula a uma exchange direct, ela fornece sua routing key. Toda mensagem direcionada para a exchange contendo a routing key da fila, será direcionada para ela.
    • Executa um round robin entre consumidores da mesma fila.

    Há uma exchange direct default em que toda fila é vinculada automaticamente com uma routing key do mesmo nome da fila.

  • Fanout

    • roteia cópias da mensagem para todas as filas vinculadas à exchange;
    • comunicação broadcast/multicast;

  • Topic

    • Roteia mensagens com base em um padrão de routing key.
    • Pode fazer comunicação unicast ou multicast;
  • Header Ignora a routing key e usa o conteúdo da mensagem para decidir a(s) fila(s) de destino.

Queues

Atributos importantes de uma queue:

  • name;
  • durability (sobreviver ou não a restarts do broker);
  • exclusive: se a fila é exclusiva, ela é usada somente por um consumidor e é removida quando o consumidor desconecta;
  • auto-delete (indica se a fila deve ser deletada se não houver mais consumidores conectados)
  • TTL: tempo que uma mensagem permanece na fila antes de ser descartada, caso não seja consumida dentro deste intervalo.
  • length: número máximo de mensagens. Após esse tamanho, a fila começa a descartar as mensagens mais antigas;

A ordem das mensagens é garantida dentro de uma fila (a menos que ela seja uma priority queue ou sharded).

Bindings

  • Toda fila deve ser vinculada a uma exchange. Caso não seja, fornecida, a exchange default é utilizada.
  • No binding é fornecido a routing key da fila. Uma fila pode ser vinculada a mais de uma exchange.

Message Acknowledgements (ACK)

Como sistemas distribuídos podem falhas, um broker AMQP só remove uma mensagem de uma fila de saída quando o consumidor envia um ACK indicando o sucesso. O ack pode ser no momento de entrega ou manual.

Quando uma mensagem não podo ser consumida pelo consumidor, este pode rejeitar a mensagem ou devolvê-la pra fila para ser consumida novamente. Ao ser rejeitada, a mensagem pode ser descartada ou enviada para uma fila de dead letters, conforme configurado pelo consumidor.

Definição das rotas

No AMQP toda configuração é feita por publishers e consumers, criação de filas, exchanges e mensagens. Isso elimina a configuração do broker mas pode levar conflitos de configuração.

Prefetching

Quando um consumer se conecta em uma fila, ele diz quantas mensagens ele é capaz de consumir ao mesmo tempo. Essa quantidade é conhecida como prefetch count.

Sobre NestJS e RabbitMQ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment