El cliente Java RabbitMQ tiene los siguientes conceptos:
Connection
- una conexión a una instancia de servidor RabbitMQChannel
- ???- Grupo de subprocesos del consumidor: un grupo de subprocesos que consumen mensajes fuera de las colas del servidor RabbitMQ
- Cola: una estructura que contiene mensajes en orden FIFO
Estoy tratando de entender la relación y , lo que es más importante , las asociaciones entre ellos.
- Todavía no estoy muy seguro de qué
Channel
es, aparte del hecho de que esta es la estructura que publica y consume, y que se crea a partir de una conexión abierta. Si alguien pudiera explicarme lo que representa el "Canal", podría ayudar a aclarar algunas cosas. - ¿Cuál es la relación entre Channel y Queue? ¿Se puede usar el mismo canal para comunicarse con múltiples colas, o tiene que ser 1: 1?
- ¿Cuál es la relación entre Queue y Consumer Pool? ¿Se pueden suscribir múltiples consumidores a la misma cola? ¿Pueden ser consumidas múltiples colas por el mismo consumidor? ¿O es la relación 1: 1?
Gracias de antemano por cualquier ayuda aquí!
Respuestas:
A
Connection
representa una conexión TCP real con el intermediario de mensajes, mientras que aChannel
es una conexión virtual (conexión AMQP) dentro de él. De esta manera, puede usar tantas conexiones (virtuales) como desee dentro de su aplicación sin sobrecargar el intermediario con conexiones TCP.Puedes usar uno
Channel
para todo. Sin embargo, si tiene varios subprocesos, se sugiere utilizar uno diferenteChannel
para cada subproceso.Seguridad de subprocesos de canal en la Guía de API de cliente Java :
No hay una relación directa entre
Channel
yQueue
. AChannel
se utiliza para enviar comandos AMQP al intermediario. Esto puede ser la creación de una cola o similar, pero estos conceptos no están unidos.Cada uno se
Consumer
ejecuta en su propio subproceso asignado desde el grupo de subprocesos del consumidor. Si se suscriben varios consumidores a la misma cola, el corredor utiliza round-robin para distribuir los mensajes entre ellos por igual. Ver Tutorial dos: "Colas de trabajo" .También es posible adjuntar lo mismo
Consumer
a múltiples colas. Puede entender a los consumidores como devoluciones de llamada. Se llaman cada vez que llega un mensaje a una Cola a la que está obligado el Consumidor. Para el caso del Cliente Java, cada Consumidor tiene un métodohandleDelivery(...)
, que representa el método de devolución de llamada. Lo que normalmente haces es subclasificarDefaultConsumer
y anularhandleDelivery(...)
. Nota: Si adjunta la misma instancia de Consumer a varias colas, este método será llamado por diferentes hilos. Así que cuide la sincronización si es necesario.fuente
Aquí es útil una buena comprensión conceptual de lo que hace el protocolo AMQP "bajo el capó". Ofrecería que la documentación y la API que AMQP 0.9.1 eligió implementar hace que esto sea particularmente confuso, por lo que la pregunta en sí es una con la que muchas personas tienen que luchar.
TL; DR
Una conexión es el socket TCP físico negociado con el servidor AMQP. Los clientes implementados correctamente tendrán uno de estos por aplicación, seguro para subprocesos, compartible entre subprocesos.
Un canal es una sesión de aplicación única en la conexión. Un hilo tendrá una o más de estas sesiones. La arquitectura 0.9.1 de AMQP es que no deben compartirse entre los subprocesos, y deben cerrarse / destruirse cuando el subproceso que lo creó termina con él. El servidor también los cierra cuando se producen varias violaciones de protocolo.
Un consumidor es una construcción virtual que representa la presencia de un "buzón" en un canal en particular. El uso de un consumidor le dice al intermediario que envíe mensajes desde una cola particular a ese punto final del canal.
Datos de conexión
Primero, como otros han señalado correctamente, una conexión es el objeto que representa la conexión TCP real al servidor. Las conexiones se especifican a nivel de protocolo en AMQP, y toda comunicación con el intermediario se realiza a través de una o más conexiones.
Datos del canal
Un canal es la sesión de la aplicación que se abre para que cada parte de su aplicación se comunique con el corredor RabbitMQ. Funciona a través de una única conexión y representa una sesión con el intermediario.
Datos del consumidor
Un consumidor es un objeto definido por el protocolo AMQP. No es un canal ni una conexión, sino que es algo que su aplicación particular utiliza como un "buzón" para colocar mensajes.
En términos de lo que quiere decir con grupo de subprocesos del consumidor, sospecho que el cliente Java está haciendo algo similar a lo que programé para que hiciera mi cliente (el mío se basó en el cliente .Net, pero muy modificado).
fuente
Encontré este artículo que explica todos los aspectos del modelo AMQP, de los cuales, el canal es uno. Me resultó muy útil para completar mi comprensión.
https://www.rabbitmq.com/tutorials/amqp-concepts.html
fuente
Existe una relación entre como una conexión TCP puede tener múltiples canales .
Canal : es una conexión virtual dentro de una conexión. Al publicar o consumir mensajes de una cola, todo se hace a través de un canal. Mientras que Conexión : es una conexión TCP entre su aplicación y el intermediario RabbitMQ.
En la arquitectura de subprocesos múltiples, es posible que necesite una conexión separada por subproceso. Eso puede conducir a una infrautilización de la conexión TCP, también agrega una sobrecarga al sistema operativo para establecer tantas conexiones TCP que requiera durante el tiempo pico de la red. El rendimiento del sistema podría reducirse drásticamente. Aquí es donde el canal resulta útil, crea conexiones virtuales dentro de una conexión TCP. Inmediatamente reduce la sobrecarga del sistema operativo, también nos permite realizar operaciones asincrónicas de una manera más rápida, confiable y simultánea.
fuente