Introducción al protocolo AMQP
AMQP (Advanced Message Queuing Protocol) es un protocolo estándar de nivel de aplicación que proporciona servicios de mensajería unificada y es un estándar abierto para protocolos de nivel de aplicación diseñados para middleware orientado a mensajes. AMQP es un protocolo de red para pasar mensajes asíncronos entre procesos.
Los clientes y middleware de mensajes basados en este protocolo pueden entregar mensajes sin estar restringidos por diferentes productos cliente/middleware, diferentes lenguajes de desarrollo, etc.
Las principales características de AMQP son orientado a mensajes, en cola, enrutamiento (incluyendo peer-to-peer y publicación/suscripción), fiabilidad y seguridad. AMQP hace cumplir el comportamiento de los proveedores de mensajes y clientes, permitiendo una verdadera interoperabilidad entre diferentes proveedores.
AMQP y JMS
JMS fue un intento de estandarizar el middleware de mensajes temprano, solo se estandarizó a nivel de API y estaba lejos de crear interoperabilidad.
A diferencia de JMS, AMQP es un protocolo a nivel de cable que describe el formato de los datos transmitidos a través de una red, fluyendo en bytes. Como resultado, cualquier herramienta que se adhiera a este formato de datos, que cree e interprete mensajes, es interoperable con otras herramientas compatibles.
Composición del núcleo AMQP
Productor
Noticias de producción.
ConnectionFactory
La fábrica que fabrica Conexión.
Conexión
Conexión, conexión de red de aplicaciones con Broker TCP/IP/Triple Handshake y Quad Wave.
Las conexiones AMQP suelen ser largas. AMQP es un protocolo de capa de aplicación que utiliza TCP para proporcionar una entrega fiable. AMQP utiliza mecanismos de autenticación y proporciona protección TLS (SSL). Cuando una aplicación ya no necesita conectarse al proxy AMQP, debe liberar la conexión AMQP de forma elegante en lugar de simplemente apagar la conexión TCP.
Canal
El canal de red es una conexión ligera construida sobre la conexión. Casi todas las operaciones se realizan en Canales, que son canales para leer y escribir mensajes, y los clientes pueden establecer pares para cada canal, cada uno de los cuales representa una tarea de sesión.
Si la conexión se compara con un cable de fibra óptica, entonces el canal del canal se compara con una de las fibras de un cable de fibra óptica. Se pueden crear cualquier número de canales en una Conexión.
La mayoría de nuestras operaciones comerciales se realizan en la interfaz del Canal, incluyendo:
- queueDeclare
- El exchangeDeclare para el switch
- queueBind queueBind
- Publicar el mensaje básico
- Noticias para consumidoresbasicConsume, etc.
Corredor
Acepta la conexión del cliente para implementar servicios de entidad AMQP, como rabbitmq.
VirtualHost (alojamiento web)
El alojamiento virtual, usado para aislamiento lógico, puede tener varios intercambios y colas, y el mismo host virtual no puede tener intercambios con el mismo nombre.
Para implementar múltiples entornos aislados (usuarios, grupos de usuarios, switches, colas, etc.) en un único proxy, AMQP proporciona el concepto de hosts virtuales (hosts virtuales - vhosts). Esto es muy similar al concepto de alojamiento web de servidores web, que proporciona un entorno completamente aislado para las entidades AMQP. Cuando se establece la conexión, el cliente AMQP especifica qué host virtual utilizar.
Intercambiar
El switch acepta mensajes y envía mensajes a la cola vinculada según la clave de enrutamiento (sin capacidad de almacenamiento de mensajes).
Un switch es una entidad AMQP utilizada para enviar mensajes. Después de que el switch recibe un mensaje, lo enruta a una o cero colas. El algoritmo de enrutamiento que utiliza está determinado por el tipo de conmutador y las reglas de enlace.
Tipo de interruptor:
- Intercambio directo
- Intercambio de fanout
- Intercambio de temas
- Intercambio de cabeceras
Propiedades del interruptor:
- Nombre: El nombre del interruptor
- Durabilidad: Una bandera de persistencia que indica si este interruptor se mantiene o no
- Eliminación automática: Bandera de borrar, indicandoCuando todas las colas terminan usando este intercambio, si se eliminan o no
- Argumentos: Dependientes del propio agente
Estado del cambio:
Los switches persistentes existirán después de reiniciar el broker, mientras que los switches de staging no (deberán redeclararse una vez que el broker esté de nuevo en línea).
Interruptor por defecto
El intercambio por defecto es en realidad un intercambio directo que está predeclarado por el intermediario de mensajes y no tiene nombre (el nombre es una cadena vacía).
Puedes pensar en el interruptor por defecto como un interruptor especial de conexión directa. Nombre del interruptor por defecto: cadena nula (AMQP por defecto) Tipo de interruptor por defecto: Interruptor de conexión directa
Al crear una cola, mientras no se especifique el switch a asignar a ser asignado, este se vinculará automáticamente al switch por defecto, y el nombre de la clave de enrutamiento de la vinculación será el mismo que el nombre de la cola.
Conexión directa al conmutador
Un conmutador de conexión directa entrega mensajes a una cola de claves de enlace correspondientes basadas en la clave de enrutamiento que lleva el mensaje. El enrutamiento unicast que utiliza el conmutador directo para manejar el mensaje.
Al crear una cola, si está vinculada a un switch directo, no es necesario especificar el nombre de la clave de enrutamiento, porque tendrá un nombre de clave de enrutamiento por defecto, que es el mismo que el nombre de la cola.
Una cola de switches conectados directamente normalmente distribuye tareas a varios consumidores en un bucle (a esto lo llamamos sondeo).
Flujo de trabajo:
- Al vincular una cola a un switch, se le asigna una clave de vinculación, asumiendo R;
- Cuando un mensaje con una Clave de Enrutamiento se envía a un conmutador conectado directamente, el conmutador lo enruta a una cola con una Clave de Enrutamiento.
Interruptores de ventilador
El switch ventilador enruta los mensajes a todas las colas vinculadas a él, independientemente de la clave de enrutamiento asignada.
Si N colas están vinculadas a un conmutador de sector, cuando se envía un mensaje a este conmutador de sector, el conmutador envía una copia del mensaje a todas las N colas por separado. Los conmutadores de ventilador se utilizan generalmente para gestionar el enrutamiento por difusión de mensajes.
Escenarios de aplicación:
difundir mensajes; Función de chat grupal.
Cambio de tema
El cambio de tema envía mensajes a una o más colas según la clave de enrutamiento y el tipo de Exchange, y a menudo lo usamos para implementar varias suscripciones de publicación/suscripción, es decir, suscripciones de publicación.
Las reglas de enrutamiento para switches conectados directamente están estrictamente igualadas, lo que significa que la Clave de Enrutamiento debe coincidir con la Clave de Vinculación antes de enviar un mensaje a la Cola. Las reglas de enrutamiento del cambio de tema son partidas difusas que se pueden entregar cumpliendo algunas reglas mediante comodines.
Estipula:
- Puede haber dos caracteres especiales * y # en la clave de asignación para emparejamiento difuso. donde * se usa para coincidir con una palabra, #用于匹配多个单词 (puede ser cero)
- Una clave de enrutamiento es una cadena separada por puntos (llamamos palabra a cada cadena individual separada por un punto marcado)
- Cuando el productor envía el mensaje Clave de Enrutamiento=A.A.A, solo se satisface A.*.* y solo se enrutará a la cola1.
- Cuando el productor envía el mensaje Clave de Enrutamiento=A.B.A, que satisfagan A.*.* y *.B.* se enrutarán a la cola1 y a la cola2.
- Cuando el productor envía el mensaje Clave de Enrutamiento=A.B.C, entonces se cumplen A.*.* y *.B.* y *.* C se dirige a la cola1, cola2, cola3.
Escenarios de aplicación:
- actualizaciones de noticias relacionadas con categorías o etiquetas;
- Tareas en segundo plano realizadas por varios trabajadores, cada uno responsable de gestionar ciertas tareas específicas.
Interruptor de cabeza
Los switches de cabeceras no dependen de las reglas de coincidencia de la clave de enrutamiento para vincular claves para enrutar mensajes, sino que coinciden en función del atributo de cabeceras en el contenido del mensaje enviado.
Los interruptores de cabeza pueden considerarse otra manifestación de un interruptor de unión directa. Sin embargo, la clave de enrutamiento de un switch directo debe ser una cadena, y los valores de los atributos de la cabecera no están limitados por esto; incluso pueden ser enteros o valores hash (diccionarios), etc. Más flexibilidad (pero en la práctica rara vez usamos interruptores de cabezal).
Flujo de trabajo:
- Cuando una cola está vinculada a un switch de cabecera, se asignan múltiples encabezados al mismo tiempo para emparejar.
- Los mensajes entrantes llevan una cabecera y un parámetro "x-match". Cuando "x-match" se pone en "any", cualquier valor del encabezado puede coincidir, y cuando "x-match" está en "all", todos los valores del encabezado deben coincidir.
Resumen de la Switch
Encuadernación
Conexión virtual entre Exchange y Queue.
BindingKey es una descripción de reglas para las vinculaciones de Exchange y Queue. La clave de enlace especifica qué tipo de Clave de Enrutamiento se asignará a la Cola actualmente vinculada bajo el intercambio actual.
Clave de Enrutamiento
Reglas de enrutamiento, que la máquina virtual puede usar para determinar cómo enrutar un mensaje concreto.
Clave de vinculación vs. clave de enrutamiento
- La clave de enlace es la clave de vinculación entre la cola y el switch;
- La Clave de Enrutamiento es una información enviada por el productor al conmutador;
- Cuando correspondan la Clave de Vinculación y la Clave de Enrutamiento, se coloca el mensaje en la cola correspondiente.
La clave de enlace es la descripción de la regla de Exchange y vinculación de colas, que se utiliza para analizar cuando Exchange recibe un mensaje; el mensaje recibido por Exchange tendrá un campo de clave de enrutamiento, y Exchange empareja esta clave de enrutamiento con todas las claves vinculantes del exchange actual, y si se cumplen los requisitos, se enviará a enlace La clave está vinculada a la Cola para enviar el mensaje.
Clave de vinculación vs. clave de enrutamiento en varios switches
Interruptor por defecto: La clave de vinculación es el nombre de la cola, que no puede personalizarse. La Clave de Enrutamiento también es el nombre de la cola antes de que pueda ser enrutada correctamente a la cola Interruptor de conexión directa: Binding Key es el nombre de la cola, que puede personalizarse. Las Claves de Enrutamiento solo pueden enrutarse con éxito a la cola cuando la Clave de Vinculación es la misma Interruptor del ventilador: Sin tecla de asignación; Por supuesto, no existe una Clave de Enrutamiento. Enrutado automáticamente a todas las colas vinculadas al switch Cambio de tema: clave de enlace personalizada; Personaliza la clave de enrutamiento. Clave de enrutamiento==Clave de vinculación, y la coincidencia difusa debe ser enrutada correctamente a la cola Interruptor de cabeza: sin tecla de asignación; Por supuesto, no existe una Clave de Enrutamiento. Coincidencias basadas en el atributo de encabezado en el contenido del mensaje enviado
Cola
Almacena mensajes que están a punto de ser consumidos por la app.
Propiedades de la cola:
- Nombre: El nombre de la cola
- Duradero: La cola sigue existiendo después de que se reinicie el broker de mensajes
- Exclusivo: Usado solo por una conexión, y la cola se elimina cuando se cierra la conexión
- Eliminación automática: Eliminada cuando el último consumidor se da de baja
- Argumentos: Algunos intermediarios de mensajes lo usan para realizar funciones adicionales similares a TTL
Creación de colas: Las colas solo pueden usarse después de declararse. Si una cola no existe ya, declarar una cola la crea. Si la cola declarada ya existe y los atributos son idénticos, la declaración no tiene efecto sobre la cola original. Si los atributos en la declaración difieren de los de la cola existente, se lanza una excepción a nivel de canal con un código de error 406.
Persistencia en la cola: La cola de persistencia se almacena en el disco y permanece allí cuando se reinicia el broker. Las colas que no se mantienen se denominan colas transitorias. No todos los escenarios y casos requieren persistencia en la cola.
Una cola persistente no hace que los mensajes que se le enrutan sean persistentes. Si el agente de mensajes se cuelga y se reinicia, la cola de persistencia se redeclarará durante el reinicio y, en cualquier caso, solo se podrán restaurar los mensajes persistentes.
Consumidor
Noticias sobre el consumo del consumidor. En AMQP, hay dos formas para que los consumidores reciban mensajes pendientes:
El middleware de mensajes entrega mensajes a los consumidores (API push) Los consumidores reciben activamente mensajes (pull API) Nota: Cuando varios consumidores escuchan la misma cola, los mensajes en la cola solo serán consumidos por uno de los consumidores (no una vez por cada consumidor)
Mensaje
Los datos transmitidos entre mensajes, servicios y aplicaciones consisten en Propiedades y cuerpos.
Los atributos modifican los mensajes, como la prioridad del mensaje, el retardo y otras características avanzadas, y el cuerpo principal es el contenido del cuerpo del mensaje.
Propiedades del mensaje:
- Tipo de contenido
- Codificación de contenido
- Clave de enrutamiento
- Modo de entrega (persistente o no)
- Modo de entrega (persistente o no persistente)
- Prioridad de mensajes
- Marca temporal de publicación de mensajes
- Periodo de caducidad
- Identificador de aplicación del editor
Cuerpo del mensaje: Además de los atributos, los mensajes AMQP también contienen una carga útil (los datos que el mensaje realmente transporta), que el proxy AMQP trata como un array opaco de bytes.
El intermediario de mensajes no inspecciona ni modifica la carga útil. Los mensajes solo pueden contener atributos sin llevar una carga útil. Normalmente utiliza datos en formato serializado como JSON, y para ahorrar dinero, los búferes de protocolo y los MessagePacks serializan los datos estructurados para publicarlos como una carga útil de mensajes. AMQP y sus homólogos suelen usar los campos "tipo de contenido" y "codificación de contenido" para comunicarse con mensajes e identificar cargas útiles, pero esto solo se basa en convenciones.
Persistencia del mensaje: Los mensajes se publican de forma persistente y el agente AMQP almacena este mensaje en disco. Si el servidor se reinicia, el sistema confirma que el mensaje de persistencia recibido no se ha perdido.
Simplemente enviar un mensaje a un switch persistente o enrutarlo a una cola persistente no hace que el mensaje sea persistente: la persistencia del mensaje depende completamente del modo de persistencia del propio mensaje.
Publicar mensajes de forma persistente puede tener un impacto en el rendimiento.
Proceso de trabajo de AMQP
El Editor publica un mensaje a través del Exchange.
El switch distribuye los mensajes entrantes a la cola vinculados al switch según las reglas de enrutamiento.
Finalmente, el agente AMQP entregará el mensaje al consumidor que se haya suscrito a esta cola, o el consumidor lo recibirá por sí mismo según sea necesario.
Mecanismo de mensajería AMQP
Confirmación del mensaje
Los consumidores ocasionalmente no procesan los mensajes o a veces se bloquean directamente. Y las razones de red también pueden causar varios problemas. Esto nos plantea la pregunta de cuándo es el momento adecuado para que los agentes de AMQP eliminen los mensajes.
Los dos modos de acuse de acuse de recibo de AMQP:
Modo de confirmación automática: Elimina el mensaje tan pronto como sea enviado al consumidor por el middleware del mensaje. (Usando el método AMQP: basic.deliver o basic.get-ok) Modo de confirmación explícita: Espera a que el consumidor envíe un acuse de recibo antes de eliminar el mensaje. (Usando el método AMQP: basic.ack) Si un consumidor cuelga sin enviar un acuse de confirmación, el agente de AMQP vuelve a entregar el mensaje a otro consumidor. Si no hay consumidores disponibles en ese momento, el broker de mensajes espera a que el siguiente consumidor se registre en esa cola y luego intenta entregar de nuevo.
Rechazar mensajes
Cuando un consumidor recibe un mensaje, el proceso de procesamiento puede tener éxito o fallar. El consumidor puede indicar al intermediario de mensajes (middleware de mensajes) que el mensaje no se procesó (o no se completó en este punto) debido a un "mensaje rechazado". Cuando un mensaje es rechazado, el consumidor puede decirle al intermediario de mensajes qué hacer con el mensaje: destruirlo o volver a ponerlo en la cola.
Cuando solo haya un consumidor en esta cola, asegúrate de no rechazar el mensaje y elegir volver a colocarlo en la cola, haciendo que el mensaje se repita indefinidamente en el mismo consumidor.
En AMQP, se utiliza el método básico.reject para realizar la operación de rechazar mensajes. Sin embargo, basic.reject tiene una limitación: no puedes usarlo para rechazar varios mensajes con acuses de reconocimiento. Pero si usas RabbitMQ, puedes usar la extensión AMQP 0-9-1 llamada acuses de recibo negativos (también llamados nacks) para resolver este problema.
Texto original en:El inicio de sesión del hipervínculo es visible.
|