O cliente Java RabbitMQ possui os seguintes conceitos:
Connection
- uma conexão com uma instância do servidor RabbitMQChannel
- ???- Conjunto de encadeamentos do consumidor - um conjunto de encadeamentos que consomem mensagens das filas do servidor RabbitMQ
- Fila - uma estrutura que mantém as mensagens na ordem FIFO
Estou tentando entender o relacionamento e , mais importante , as associações entre eles.
- Ainda não tenho muita certeza do que
Channel
é, além do fato de que essa é a estrutura da qual você publica e consome, e que é criada a partir de uma conexão aberta. Se alguém puder me explicar o que o "Canal" representa, isso poderá ajudar a esclarecer algumas coisas. - Qual é a relação entre Canal e Fila? O mesmo canal pode ser usado para se comunicar com várias filas ou precisa ser 1: 1?
- Qual é o relacionamento entre a fila e o pool de consumidores? Vários consumidores podem ser inscritos na mesma fila? Várias filas podem ser consumidas pelo mesmo consumidor? Ou o relacionamento é 1: 1?
Agradecemos antecipadamente por qualquer ajuda aqui!
Respostas:
A
Connection
representa uma conexão TCP real com o intermediário de mensagens, enquanto aChannel
é uma conexão virtual (conexão AMQP) dentro dele. Dessa forma, você pode usar quantas conexões (virtuais) quiser dentro do aplicativo sem sobrecarregar o broker com conexões TCP.Você pode usar um
Channel
para tudo. No entanto, se você tiver vários threads, é recomendável usar um diferenteChannel
para cada thread.Segurança de encadeamento de canal no Java Client API Guide :
Não há relação direta entre
Channel
eQueue
. AChannel
é usado para enviar comandos AMQP para o broker. Isso pode ser a criação de uma fila ou similar, mas esses conceitos não estão ligados.Cada um
Consumer
é executado em seu próprio encadeamento alocado no conjunto de encadeamentos do consumidor. Se vários Consumidores forem inscritos na mesma Fila, o broker usará round-robin para distribuir as mensagens entre eles igualmente. Consulte o Tutorial dois: "Filas de trabalho" .Também é possível anexar o mesmo
Consumer
a várias filas. Você pode entender os consumidores como retornos de chamada. Eles são chamados toda vez que uma mensagem chega em uma fila à qual o consumidor está vinculado. Para o caso do Java Client, cada Consumidor possui um métodohandleDelivery(...)
, que representa o método de retorno de chamada. O que você normalmente faz é subclasseDefaultConsumer
e substituiçãohandleDelivery(...)
. Nota: Se você anexar a mesma instância do Consumidor a várias filas, esse método será chamado por diferentes threads. Portanto, cuide da sincronização, se necessário.fonte
Uma boa compreensão conceitual do que o protocolo AMQP faz "sob o capô" é útil aqui. Eu diria que a documentação e a API que o AMQP 0.9.1 optou por implantar tornam isso particularmente confuso, de modo que a questão em si é aquela que muitas pessoas precisam enfrentar.
TL; DR
Uma conexão é o soquete TCP negociado físico com o servidor AMQP. Os clientes implementados adequadamente terão um desses por aplicativo, thread-safe, compartilhável entre threads.
Um canal é uma única sessão de aplicativo na conexão. Um encadeamento terá uma ou mais dessas sessões. A arquitetura AMQP 0.9.1 é que eles não devem ser compartilhados entre os threads e devem ser fechados / destruídos quando o thread que o criou terminar com ele. Eles também são fechados pelo servidor quando ocorrem várias violações de protocolo.
Um consumidor é uma construção virtual que representa a presença de uma "caixa de correio" em um canal específico. O uso de um consumidor informa ao broker para enviar mensagens de uma fila específica para o nó de extremidade do canal.
Fatos da conexão
Primeiro, como outros apontaram corretamente, uma conexão é o objeto que representa a conexão TCP real com o servidor. As conexões são especificadas no nível do protocolo no AMQP, e toda a comunicação com o broker ocorre através de uma ou mais conexões.
Fatos do canal
Um canal é a sessão do aplicativo que é aberta para cada parte do seu aplicativo se comunicar com o broker RabbitMQ. Ele opera em uma única conexão e representa uma sessão com o broker.
Fatos do Consumidor
Um consumidor é um objeto definido pelo protocolo AMQP. Não é um canal nem uma conexão, sendo algo que seu aplicativo específico usa como uma "caixa de correio" para eliminar mensagens.
Em termos do que você quer dizer com pool de encadeamentos do consumidor, suspeito que o cliente Java esteja fazendo algo semelhante ao que eu programei (o meu foi baseado no cliente .Net, mas fortemente modificado).
fonte
Encontrei este artigo que explica todos os aspectos do modelo AMQP, dos quais canal é um. Eu achei muito útil para completar minha compreensão
https://www.rabbitmq.com/tutorials/amqp-concepts.html
fonte
Há uma relação entre como Uma conexão TCP pode ter vários canais .
Canal : é uma conexão virtual dentro de uma conexão. Ao publicar ou consumir mensagens de uma fila - tudo é feito em um canal. Considerando Conexão : É uma conexão TCP entre seu aplicativo e o broker RabbitMQ.
Na arquitetura multithread, você pode precisar de uma conexão separada por thread. Isso pode levar à subutilização da conexão TCP, além de adicionar sobrecarga ao sistema operacional para estabelecer quantas conexões TCP forem necessárias durante o horário de pico da rede. O desempenho do sistema pode ser drasticamente reduzido. É aqui que o canal se torna útil, ele cria conexões virtuais dentro de uma conexão TCP. Imediatamente reduz a sobrecarga do sistema operacional e também permite realizar operações assíncronas de maneira mais rápida, confiável e simultaneamente.
fonte