RabbitMQ - Introducción
Los componentes se explican a continuación:
Se agregaron las funciones de Exchange y Binding en el enrutamiento de mensajes AMQP. El productor publica el mensaje en Exchange, el mensaje finalmente llega a la cola y es recibido por el consumidor, y el enlace decide a qué cola se debe enviar el mensaje desde el intercambiador.
Exchange distribuye los mensajes de forma diferente según el tipo de política de distribución. Actualmente hay cuatro tipos: directo, distribuido, por tema y de encabezado. Los encabezados coinciden con el encabezado del mensaje AMQP en lugar de con la clave de enrutamiento. Los intercambios de encabezado son exactamente iguales que los intercambios directos, pero tienen un rendimiento mucho peor y casi nunca se utilizan hoy en día.
Si la clave de enrutamiento en el mensaje coincide con la clave de enlace en el enlace, el conmutador enviará el mensaje a la cola apropiada. La clave de enrutamiento coincide exactamente con el nombre de la cola. Si la cola está vinculada al conmutador con la clave de enlace "dog", el conmutador solo reenviará los paquetes con la clave de enrutamiento marcada "dog" en lugar de "dog.puppy" o "dog.guard", etc. Esta es una coincidencia exacta, unidifusión. Este es un modo de unidifusión de coincidencia exacta.
Cada mensaje enviado a un conmutador de tipo fanout se distribuye 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. Al igual que una transmisión de subred, cada host de la subred recibe una copia del mensaje. Los paquetes de tipo fan-out se reenvían más rápido.
Tema El conmutador asigna los atributos de la clave de enrutamiento del paquete mediante un patrón que coincide con la clave de enrutamiento con un patrón específico. En este momento, la cola debe estar vinculada al patrón. Cortará la clave de enrutamiento y las cadenas de claves de enlace en palabras separadas por puntos. También reconoce dos caracteres comodín: el símbolo "#" y el símbolo "".
El símbolo "#" puede coincidir con cero o más palabras, y el símbolo "" puede coincidir con una o más palabras.
El mecanismo de distribución de RabbitMQ es muy adecuado para escalar. Está diseñado para programas concurrentes, por lo que si la carga es pesada ahora, simplemente cree más consumidores para la tarea.
En la práctica, puede suceder que después de que un consumidor recibe un mensaje en la cola, este falle (o ocurra de otra manera) antes de completar el procesamiento, lo que puede resultar en la pérdida del mensaje. Para evitar esta situación, podemos exigir que el consumidor envíe una confirmación a RabbitMQ después de consumir el mensaje. RabbitMQ solo eliminará el mensaje de la cola después de recibir la confirmación del mensaje si RabbitMQ no recibe la confirmación y no detecta el RabbitMQ del consumidor; conexión Desconéctese, RabbitMQ enviará el mensaje a otro consumidor (si hay varios consumidores) para su procesamiento. No existe el concepto de tiempos de espera; un consumidor que tarda demasiado en procesar un mensaje no hará que el mensaje se envíe a otro consumidor a menos que su conexión RabbitMQ haya sido interrumpida. Otro problema surge si nuestros desarrolladores olvidan enviar una confirmación a RabbitMQ después de procesar la lógica empresarial, lo que puede provocar errores graves: se acumularán cada vez más mensajes en la cola, el consumidor reiniciará y consumirá mensajes y repetirá la lógica empresarial;
Además, los mensajes de publicación no tienen reconocimientos.
Si queremos que los mensajes no se pierdan incluso si se reinicia el servicio RabbitMQ, podemos hacer que tanto la cola como el mensaje sean duraderos, lo que asegurará que nuestros mensajes RabbitMQ no se perderán en la gran mayoría de los casos. casos. Esto asegurará que en la mayoría de los casos nuestros mensajes RabbitMQ no se pierdan. Sin embargo, esto no resuelve el problema de la pequeña pérdida de probabilidad (por ejemplo, el servidor RabbitMQ ha recibido el mensaje del productor, pero antes de que tenga tiempo de persistir el mensaje, el servidor RabbitMQ se apaga si necesitamos administrarlo). este pequeño evento de probabilidad, entonces necesitamos usar transacciones.
Dado que esta es solo una breve introducción a RabbitMQ, no cubriremos aquí los asuntos relacionados con RabbitMQ.
Para que una cola sea duradera, debe especificar durable=True
Tenga en cuenta que el nombre de la cola no debe existir en el Broker; de lo contrario, no podrá cambiar ninguno de ellos. sus propiedades.
Las colas y los conmutadores se especifican con un indicador duradero cuando se crean, y el único significado de duradero es que las colas y los conmutadores con este indicador se restablecerán después de un reinicio, lo que no significa que los mensajes; en la cola estará Recuperar después del reinicio.
La persistencia del mensaje consta de 3 partes
Si tanto el intercambio como la cola son duraderos, entonces la vinculación entre ellos también lo es si uno de los intercambios y la cola es duradero; mientras que el otro no es persistente, no se permite ninguna vinculación.
Nota: Una vez que crea colas e intercambios, no puede cambiar sus etiquetas; por ejemplo, si crea una cola no duradera y luego desea cambiarla a duradera, la única forma es eliminar la cola y recrear.
Te habrás dado cuenta de que 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 y no le importa si el consumidor todavía tiene mensajes no reconocidos, simplemente los distribuye de acuerdo con este mecanismo predeterminado.
Entonces, si hay mucho trabajo para los Consumidores, algunos Consumidores no tienen nada que hacer y otros Consumidores no tienen nada que hacer, ¿cómo maneja Rabbit esta situación?
RabbitMQ utiliza ProtoBuf para serializar mensajes, que pueden transmitirse como el formato de datos de mensajes de RabbitMQ. Debido a que se trata de datos estructurados, es muy fácil para los consumidores procesar los datos de manera eficiente.