Red de conocimiento informático - Problemas con los teléfonos móviles - Arquitectura RabbitMQ

Arquitectura RabbitMQ

RabbitMQ es un sistema distribuido

I. Diagrama de arquitectura del sistema cuando se usa Rabbitmq

Los conmutadores y las colas están vinculados mediante claves de enrutamiento para enviar y recibir mensajes.

2. Conceptos básicos de Rabbitmq

Rabbitmq es una implementación de código abierto del protocolo AMQP, por lo que su estructura interna es en realidad la misma que el concepto básico de AMQP, como se muestra en la siguiente figura:

1. Mensaje

Un mensaje es anónimo y consta de un encabezado y un cuerpo de mensaje. El cuerpo del mensaje es opaco, mientras que el encabezado del mensaje consta de un conjunto de atributos opcionales, que incluyen clave de enrutamiento (clave de enrutamiento), prioridad (prioridad en relación con otros mensajes), modo de entrega (modo de entrega, que indica que el mensaje puede requerir almacenamiento persistente) , etc.

2. Productor de mensajes

Un productor de mensajes también es una aplicación cliente que publica mensajes en el centro de intercambio y es un programa que transmite mensajes.

3.Exchange

Exchange se utiliza para recibir mensajes enviados por productores de mensajes y enrutarlos a colas en el servidor. Conmutador de mensaje, utilizado para especificar a qué reglas se enruta el mensaje y a qué cola se enruta.

4. Palabra clave de enrutamiento

Palabra clave de enrutamiento, el switch transmite mensajes basados ​​en esta palabra clave.

5. Enlace

Se utiliza para asociar colas de mensajes e intercambios. Un enlace es una regla de enrutamiento que conecta un intercambio a una cola de mensajes en función de claves de enrutamiento, por lo que un intercambio puede entenderse como una tabla de enrutamiento compuesta de enlaces.

Su función es vincular intercambios y colas de acuerdo con reglas de enrutamiento.

El enlace en realidad asocia un intercambio con una cola, o puede expresarlo de esta manera: la cola está interesada en el contenido del intercambio y el intercambio quiere entregar sus mensajes a la cola. Cola (Cola de mensajes)

Como portador de mensajes, cada mensaje se publica en una o más colas y espera a que los consumidores se conecten a la cola para recibirlo. Es el contenedor de mensajes y el punto final de los mensajes.

7. Conexión

Conexión de red, como conexión TCP.

8. Canal (canal, canal)

Canal de mensajes, se pueden crear múltiples canales en cada conexión del cliente.

Un canal de flujo de datos bidireccional independiente en una conexión multiplexada. Un canal es una conexión virtual construida sobre una conexión TCP real. Los comandos AMQP se emiten a través de canales, ya sea publicando mensajes, suscribiéndose a colas o recibiendo mensajes, todas estas operaciones se completan a través de canales. Dado que establecer y destruir TCP es muy costoso para el sistema operativo, el concepto de canales se introduce en las conexiones TCP multiplexadas.

9. Consumidor de mensajes

El consumidor de mensajes representa la aplicación cliente que obtiene el mensaje de la cola de mensajes y es el programa que recibe el mensaje.

10. Host virtual

Un host virtual representa un conjunto de conmutadores, colas de mensajes y objetos relacionados. Puede haber varios hosts virtuales en un proxy para separar permisos para diferentes usuarios. Los hosts virtuales son dominios de servidores independientes que comparten el mismo entorno de autenticación y cifrado. Cada vhost es esencialmente una versión mini del servidor Rabbitmq, con sus propias colas, conmutadores, enlaces y mecanismos de permisos.

vhost es la base de los conceptos AMQP y debe especificarse en el momento de la conexión.

11. broker

representa la entidad del servidor de cola de mensajes. Proporciona un servicio de transporte cuya función es mantener el enrutamiento desde los productores a los consumidores, asegurando que los datos se transmitan de la manera especificada.

III. Enrutamiento de mensajes en AMQP

El productor publica un mensaje en el intercambio, el mensaje finalmente llega a la cola y es recibido por el consumidor, y luego el enlace decide si el mensaje. del intercambio debe ser A qué cola enviar. Como se muestra en la siguiente figura:

4. Tipos de conmutadores

Los conmutadores tienen diferentes estrategias para asignar mensajes según diferentes tipos. Actualmente, existen cuatro tipos: directo, fan-out,. tema, información del encabezado.

La información del encabezado coincide con el encabezado del mensaje AMQP en lugar de la clave de enrutamiento. Además, el intercambio de información del encabezado es el mismo que el intercambio directo, pero el rendimiento es mucho peor y actualmente casi no se utiliza. Veamos los tres tipos: directo, fan-out y temático.

1. Directo

Si la clave de enrutamiento en el mensaje es la misma que la clave de enlace en el enlace, el intercambio enviará el mensaje a la cola correspondiente. La clave de enrutamiento coincide exactamente con el nombre de la cola. Si la cola está vinculada a un conmutador que requiere una clave de enrutamiento de "perro", entonces solo se reenviarán los paquetes con una clave de enrutamiento de "perro", no "dog.puppy", etc. Este es un modelo de propagación única perfectamente adaptado.

El algoritmo de enrutamiento del intercambio Driect es muy simple: coincidencia exacta mediante clave de enlace, como se muestra en la siguiente figura:

El intercambio se vincula a dos colas, la clave de enlace del Q1 es naranja, las teclas vinculantes de Q2 son negras y verdes.

Cuando la clave de publicación del Productor es naranja, Exchange la pone en Q1, si es negra o verde, la pone en Q2, y el resto de mensajes se descartan.

2. Tipo de distribución

Cada mensaje enviado al centro de intercambio de tipo de distribución se distribuirá a todas las colas vinculadas. Los conmutadores Fanout no manejan claves de enrutamiento, simplemente vinculan colas al conmutador y cada mensaje enviado al conmutador se reenvía a todas las colas vinculadas a ese conmutador. De manera similar a una transmisión de subred, cada host de la subred recibe una copia del mensaje. El tipo de distribución en abanico reenvía la información más rápido. ?Como se muestra en la siguiente figura:

3. Tipo de tema

El selector de temas asigna el atributo de clave de enrutamiento del mensaje por patrón que coincide con la clave de enrutamiento con un patrón específico. tiempo, es necesario Vincular la cola al esquema. Corta las cadenas de claves de enrutamiento y claves de enlace en palabras, separadas por puntos. También reconoce dos caracteres comodín: # y *, donde # coincide con cero o más palabras y * coincide solo con una palabra.

La clave de enrutamiento del mensaje está restringida y no puede ser arbitraria. El formato es una lista de caracteres separados por puntos ".". Por ejemplo: "stock.usd.nyse", "nyse.vyw", "quick.orange.rabbit". Hay dos caracteres especiales # y * en route_key # puede coincidir con 0 o más palabras y * solo puede coincidir con una palabra. Como se muestra en la siguiente figura:

El productor necesita configurar route_key al enviar mensajes. route_key contiene tres palabras y dos símbolos de puntos, la primera palabra clave describe la velocidad, la segunda es el color y la tercera es la especie.

Aquí, creamos dos enlaces: la clave de enlace de Q1 es ".orange"; la clave de enlace de Q2 es ".rabbit" y "lazy#": Q1 Sigue a todos los animales naranjas. Q2 se centra en todos los conejos; y todos los animales perezosos.

Por ejemplo: la clave_redonda de "quick.orange.rabbit" se enviará a Q1 y Q2 al mismo tiempo. La clave redondeadora de "lazy.orange.rabbit.hujj.ddd" se enviará al segundo trimestre, # que coincida con 0 o más palabras.

5. ConnectionFactory, Connection y Channel

ConnectionFactory, Connection y Channel son los objetos más básicos en la API externa de RabbitMQ.

1.Conexión

La conexión es una conexión de socket Rabbitmq, que encapsula cierta lógica relacionada con el protocolo de socket.

2.ConnectionFactory

ConnectionFactory es una fábrica para establecer conexiones.

3. Canal

El canal es la interfaz más importante para nosotros para tratar con Rabbitmq. La mayoría de las operaciones comerciales se completan en la interfaz del canal, incluida la definición de colas, la definición de Exchange y la vinculación de colas. Intercambiar, publicar mensajes, etc.

6. Mecanismo de distribución de tareas

1. Distribución por turnos

El mecanismo de distribución de RabbitMQ es muy adecuado para la expansión y está especialmente diseñado para programas concurrentes, si. la carga aumenta ahora, solo necesita crear más consumidores para el procesamiento de tareas.

2.

2. Confirmación de mensaje Confirmación de mensaje

Para garantizar que no se pierdan datos, RabbitMQ admite el mecanismo de confirmación de mensaje. que los datos puedan procesarse correctamente. No solo los recibe el Consumidor, sino que también debe enviar un acuse de confirmación después del procesamiento de los datos. Enviar un recibo de confirmación después de procesar los datos le dice a RabbitMQ que los datos han sido recibidos y procesados, y RabbitMQ puede eliminar el mensaje de la cola. Si un consumidor sale sin enviar un recibo, RabbitMQ enviará el mensaje al siguiente consumidor para garantizar que no se pierdan datos si el consumidor sale de manera anormal.

RabbitMQ no utiliza un mecanismo de tiempo de espera. Solo confirma que el mensaje no se ha procesado correctamente debido a la interrupción de la conexión del Consumidor. Un Consumidor que tarda mucho en procesar el mensaje no provocará el error. mensaje que se enviará a otros Consumidores, lo que significa que Deje que RabbitMQ le dé al Consumidor suficiente tiempo para completar el procesamiento de datos. Si olvida el reconocimiento, cuando el consumidor salga, los mensajes se reasignarán, lo que provocará que se acumulen más y más mensajes en la cola y RabbitMQ ocupará cada vez más memoria.

3. Persistencia de mensajes Persistencia de mensajes

Si esperamos que los mensajes no se pierdan incluso si se reinicia el servicio Rabbitmq, podemos configurar tanto la cola como el mensaje en persistencia, lo que Se asegurará de que nuestros mensajes de Rabbitsmq no se pierdan en la mayoría de los casos. Sin embargo, esto no resuelve el problema de la pequeña pérdida de probabilidad (por ejemplo, si el servidor Rabbitmq recibe un mensaje del productor y el servidor Rabbitmq se queda sin energía antes de que tenga la oportunidad de persistir el mensaje). Si también desea gestionar eventos tan raros, debe utilizar transacciones. Para que una cola sea duradera, debe especificar durable=True al declarar la cola; tenga en cuenta que el nombre de la cola no debe existir en el intermediario; de lo contrario, no se podrán cambiar las propiedades de la cola. Tanto las colas como los conmutadores se crean con el indicador persistente especificado. El único significado de un indicador persistente es permitir que las colas y los conmutadores con ese indicador se restablezcan después de un reinicio. QueueDeclare(QueueName, durable:true, exclusiva:false, exclusiva:true)

canal.durable:true, exclusiva:false, autoDelete:false, arguments:null);//Declarar la cola de mensajes y persistir it

(3) Persistencia del mensaje, especifique delivery_mode => 2 (1 es no persistente) al enviar.

channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

Si tanto el intercambio como la cola son persistentes, también lo es el enlace entre ellos. Durable si uno de los intercambios y colas es duradero y el otro no es duradero, no se permite ninguna vinculación.

Nota: Una vez creadas las colas y los intercambios, sus indicadores no se pueden modificar. Por ejemplo, si crea una cola no duradera y luego desea cambiarla a una cola duradera, la única forma es eliminar la cola y volver a crearla.

4. Distribución justa Distribución justa

Como habrás notado, el mecanismo de distribución no es muy elegante. De forma predeterminada, RabbitMQ distribuye el enésimo mensaje al enésimo consumidor. n es el resto del enésimo mensaje, no importa si el consumidor tiene mensajes no reconocidos. No le importa si el consumidor todavía tiene paquetes sin empaquetar y simplemente los distribuye según el mecanismo predeterminado. Por lo tanto, si la carga de trabajo de los Consumidores es pesada, entonces algunos Consumidores no tendrán nada que hacer y otros Consumidores no tendrán la oportunidad de descansar, entonces, ¿cómo aborda Rabbit este problema?

Establezca prefetch_count=1 mediante el método basic.qos, como se muestra a continuación

channel.basic_qos(prefetch_count=1)

De esta manera, RabbitMQ hará cada Consumidor procesa como máximo un mensaje; en otras palabras, no distribuye nuevos mensajes a ese Consumidor hasta que recibe un acuse de recibo. Pero este enfoque puede provocar que la cola se llene. Por supuesto, en este caso, es posible que necesite agregar más consumidores o crear más hosts virtuales para perfeccionar su diseño.

5. Asignado a múltiples consumidores

Intercambio directo: coincidencia directa, envío y recepción de mensajes a través del nombre de Exchange + RountingKey.

Fanout Exchange: suscripción de transmisión, distribuye mensajes a todos los consumidores, pero solo los consumidores que vinculan la cola a este enrutador pueden recibir mensajes, ignorando las claves de enrutamiento.

Intercambio de temas: suscripción de coincidencia de temas, donde el tema hace referencia a la clave de enrutamiento. RoutingKey puede usar comodines, como * o #: * o #. Use puntos en inglés para separar varias palabras al nombrar RoutingKey. Solo cuando el correo electrónico esté vinculado a la cola del enrutador y la RoutingKey especificada cumpla con las reglas de coincidencia, el correo electrónico será. tomar el control.

Intercambio de encabezados: suscripción de encabezado de mensaje, defina uno o más encabezados de mensaje de pares clave-valor para el mensaje antes de que se publique y luego, cuando el consumidor reciba el mensaje, también debe definir un encabezado de solicitud. similar al par clave-valor (como

x-mactch=all o x_match=any), solo el encabezado de la solicitud y el encabezado del mensaje coinciden, el mensaje se puede recibir y la RoutingKey se ignora.

Intercambio predeterminado: Si un intercambio se declara con una cadena vacía, el sistema utilizará el intercambio "amq.direct". Cuando creamos una cola, de forma predeterminada hay una clave de ruta vinculada al intercambio predeterminado con el mismo nombre que la nueva cola. Como se muestra a continuación:

channel.BasicPublish("", "TaskQueue",properties,bytes);

Porque el intercambio predeterminado se selecciona en el primer parámetro y declaramos La cola se llama TaskQueue, por lo que de forma predeterminada se crea una nueva clave de enrutamiento, también llamada TaskQueue.

Si escribimos TaskQueue en el segundo parámetro routeKey, encontrará la cola definida con el mismo nombre y colocará el mensaje en ella.

Si hay dos receptores vinculados a un intercambio directo con la misma cola y la misma clave de enrutamiento, entonces el comportamiento de distribución es el equilibrio de carga, es decir, el primero lo recibe el programa 1 y el segundo lo recibe el programa 2, y así sucesivamente.

Si hay dos programas receptores con sus propias colas, pero las claves de enrutamiento vinculadas al intercambio directo son las mismas, el comportamiento de distribución se replica, es decir, cada programa recibe una copia del mensaje. Este comportamiento es equivalente a un tipo de intercambio fanout.

También es posible utilizar varias colas vinculadas a la misma clave.

En el siguiente ejemplo, tanto Q1 como Q2 están vinculados al color negro; para un mensaje con clave de enrutamiento negra, se enviará a Q1 y Q2, mientras que otros mensajes se descartarán.

Llamada a procedimiento remoto VII.RPC

MQ en sí se basa en el procesamiento de mensajes asincrónicos. Todos los productores (P) en el ejemplo anterior no saben después de enviar el mensaje a RabbitMQ El consumidor ( C) no podrá manejar el éxito o el fracaso del mensaje (ni siquiera saber si hay un consumidor para manejar este mensaje). Sin embargo, en escenarios de aplicaciones reales, es posible que necesitemos cierta sincronización. Necesitamos sincronizar y esperar a que el servidor procese mi mensaje antes de continuar con el siguiente paso. Esto es equivalente a RPC (llamada a procedimiento remoto). RabbitMQ también es compatible con RPC.

El mecanismo para implementar RPC en RabbitMQ es como se muestra en la siguiente figura:

Cuando el cliente envía una solicitud (mensaje), estará en las propiedades del mensaje (MessageProperties? ( en las propiedades del mensaje (protocolo AMQP) hay 14 propiedades definidas en respuesta a (el nombre de la cola para decirle al servidor que envíe un mensaje de notificación a esta cola después de que se complete el procesamiento) y correlaciónId (el número de identificación de la solicitud, el servidor Este número de identificación debe devolverse después de que se complete el procesamiento, y el cliente utilizará este número de identificación para comprender qué solicitud se ejecutó con éxito o qué solicitud se ejecutó (el servidor debe devolver este atributo después de procesar la solicitud)

El servidor lo recibe y procesa el mensaje. Después de procesar el mensaje, el servidor generará un mensaje de respuesta con el atributo correlaciónId? ejecutado y luego ejecute el proceso comercial posterior según el resultado de la ejecución.

Adelante: blogs.com/jasonboren/p/13280745.html

.