Bom dia, Habr! Quero compartilhar um guia de estudo e referência dos conhecimentos que consegui reunir sobre RabbitMQ e condensar em recomendações e conclusões resumidas.
Índice
- RabbitMQ. Parte 1. Introdução. Erlang, AMQP e RPC
- RabbitMQ. Parte 2. Entendendo os Exchanges
- RabbitMQ. Parte 3. Entendendo as Queues e Bindings
- RabbitMQ. Parte 4. Entendendo o que são mensagens e quadros
- RabbitMQ. Parte 5. Desempenho da publicação e consumo de mensagens
- RabbitMQ. Parte 6. Visão geral dos módulos Federation e Shovel
- RabbitMQ. Parte 7. Detalhes sobre Connection e Channel
- RabbitMQ. Parte 8. RabbitMQ no .NET
- RabbitMQ. Parte 9. Monitoramento
Um breve resumo sobre AMQP
AMQP (Advanced Message Queuing Protocol) é um protocolo aberto para a transmissão de mensagens entre componentes do sistema. A ideia principal é que subsistemas separados (ou aplicativos independentes) possam trocar mensagens de forma arbitrária através de um broker AMQP, que realiza o roteamento, garante a entrega, distribui fluxos de dados e permite a assinatura em tipos específicos de mensagens.
Protocolo AMQP introduz três conceitos:

exchange(ponto de troca ou exchange) — é onde as mensagens são enviadas. O ponto de troca distribui a mensagem roteia essas mensagens para uma ou mais filas. Ele roteia mensagens para a fila com base nas relações criadas (binding) entre ele e a filafila(fila) — é uma estrutura de dados em disco ou na memória, que armazenam referências às mensagens e fornece cópias das mensagensconsumidores(para os consumidores)binding(vinculação) — é uma regra que informa ao ponto de troca para qual fila essas mensagens devem ser enviadas.
O protocolo opera sobre .
Um resumo breve sobre Erlang
O código-fonte do projeto está no repositório em . A arquitetura baseada em e BEAM.
Erlangfoi desenvolvido pelaEricssonno meio da década de 1980 como um sistema de tempo real distribuído e tolerante a falhas para aplicações que requerem operação ininterrupta de 99,999%.Erlangé utilizado em diversas indústrias e aplicações modernas, como em
Um resumo breve sobre RabbitMQ
é um broker de mensagens de código aberto. Ele roteia mensagens com base em todos os princípios fundamentais do protocolo descritos em . RabbitMQ implementa e complementa o protocolo. AMQP.
A ideia principal do modelo de troca de mensagens em RabbitMQ é que o producer (publicador) não envia mensagens diretamente para a fila. Na verdade, muitas vezes o publicador nem sabe se a mensagem será entregue a alguma fila.
Em vez disso, o editor pode enviar mensagens apenas para a troca. De um lado, a troca recebe mensagens dos editores, e do outro, as envia para filas. A troca deve saber exatamente o que fazer com a mensagem recebida. Deve ela ser adicionada a uma fila específica? Deve ela ser adicionada a várias filas? Ou a mensagem deve ser ignorada?

A operação pode ser resumida da seguinte forma: RabbitMQ pode ser descrito da seguinte maneira:
- O editor envia uma mensagem para uma troca específica.
- A troca, ao receber a mensagem, a roteia para uma ou mais filas de acordo com as regras de vinculação entre ela e a fila.
- A fila mantém uma referência a esta mensagem. A própria mensagem é armazenada na memória ou no disco.
- Assim que o consumidor está pronto para receber a mensagem da fila, o servidor cria uma cópia da mensagem por meio da referência e a envia.
- O consumidor recebe a mensagem e envia uma confirmação ao broker.
- O broker, ao receber a confirmação, remove a cópia da mensagem da fila. Em seguida, elimina da memória e do disco.
RPC
Processo é a base da maioria das interações com o núcleo. RabbitMQPor exemplo, as discussões iniciais das condições do cliente com RabbitMQ, demonstra um certo processo. RPCAssim que esta sequência é concluída, RabbitMQ estará pronto para receber solicitações do cliente:

Além disso, na especificação AMQP tanto o cliente quanto o servidor podem chamar comandos. Isso significa que o cliente aguarda interação com o servidor. Os comandos são classes e métodos. Por exemplo, Connection.Start – chamada do método. Iniciar classe Conexão.
Conexões e canais
Para essa troca de informações entre cliente e servidor, são utilizados canais.Os canais são criados dentro de uma conexão específica.Cada canal é isolado de outros canais. No caso de uma operação síncrona, não é possível executar o próximo comando até que a resposta seja recebida.
Para permitir o envio de comandos em paralelo, é necessário abrir vários canais. Cada canal cria um Erlang processo separado. Uma única conexão pode ter múltiplos canais (). Para cada canal, existem certas estruturas e objetos na memória. Portanto, quanto mais canais houver dentro da conexão, mais memória RabbitMQ usa para gerenciar tal conexão.

Um exemplo simples de criação de uma conexão e canal usando :
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}Abrir uma nova conexão para cada operação é fortemente desencorajado, pois isso resultará em altos custos. Os canais também precisam ser constantes, mas muitos erros de protocolo resultam no fechamento do canal, portanto, a vida útil do canal pode ser mais curta do que a da conexão.
Onde é utilizado RabbitMQ?
No contexto de microsserviços, o protocolo AMQP e sua implementação em RabbitMQ são frequentemente utilizados para interação assíncrona entre serviços.
No contexto de IIOT protocolo AMQP e sua implementação em RabbitMQ é usado para troca de dados entre servidores (servidor-servidor). Também é utilizado o plugin que é uma implementação do protocolo para transmissão de dados entre sensores e servidores em ambientes de baixa largura de banda e alta latência (lista completa de protocolos suportados está disponível em ).
No próximo artigo, começaremos a explorar mais detalhadamente sobre Exchanges.
Links
Fonte: habr.com
