tutorial parallel exchanges espaƱol queue rabbitmq message-queue

parallel - rabbitmq queue



RabbitMQ-orden de los mensajes de entrega (3)

Bueno, echemos un vistazo más de cerca al escenario que está describiendo arriba. Creo que es importante pegar la documentación inmediatamente antes del fragmento en su pregunta para proporcionar contexto:

La sección 4.7 de la especificación básica AMQP 0-9-1 explica las condiciones bajo las cuales se garantiza el orden: los mensajes publicados en un canal, que pasan por un intercambio y una cola y un canal saliente se recibirán en el mismo orden en que se enviaron. RabbitMQ ofrece garantías más sólidas desde la versión 2.7.0.

Los mensajes pueden devolverse a la cola utilizando métodos AMQP que tienen un parámetro de repetición (basic.recover, basic.reject y basic.nack), o debido a un cierre de canal mientras se mantienen mensajes no reconocidos. Cualquiera de estos escenarios causó que los mensajes se pusieran en la cola de la cola para lanzamientos de RabbitMQ anteriores a 2.7.0. Desde la versión 2.7.0 de RabbitMQ, los mensajes siempre se mantienen en la cola en orden de publicación, incluso en presencia de reabastecimiento o cierre de canal. (énfasis añadido)

Por lo tanto, está claro que RabbitMQ, desde 2.7.0 en adelante, está haciendo una mejora bastante drástica con respecto a la especificación AMQP original con respecto al pedido de mensajes.

Con múltiples consumidores (paralelos), no se puede garantizar el orden de procesamiento.
El tercer párrafo (pegado en la pregunta) continúa y proporciona un descargo de responsabilidad, que voy a parafrasear: "si tiene múltiples procesadores en la cola, ya no hay garantía de que los mensajes se procesarán en orden". Todo lo que dicen aquí es que RabbitMQ no puede desafiar las leyes de las matemáticas.

Considere una línea de clientes en un banco. Este banco en particular se enorgullece de ayudar a los clientes en el orden en que ingresaron al banco. Los clientes se alinean en una cola y son atendidos por los siguientes 3 cajeros disponibles.

Esta mañana, sucedió que los tres cajeros estuvieron disponibles al mismo tiempo, y los siguientes 3 clientes se acercaron. De repente, el primero de los tres cajeros se enfermó violentamente y no pudo terminar de atender al primer cliente en la fila. Para cuando esto sucedió, el cajero 2 había terminado con el cliente 2 y el cajero 3 ya había comenzado a atender al cliente 3.

Ahora, una de dos cosas puede suceder. (1) El primer cliente en línea puede volver al principio de la línea o (2) el primer cliente puede adelantarse al tercer cliente, lo que hace que ese cajero deje de trabajar en el tercer cliente y comience a trabajar en el primero. Este tipo de lógica de exclusión no es compatible con RabbitMQ ni con ningún otro intermediario de mensajes del que sea consciente. En cualquier caso, el primer cliente en realidad no termina recibiendo ayuda primero - el segundo cliente lo hace, teniendo la suerte de obtener un buen y rápido cajero de inmediato. La única forma de garantizar que los clientes reciban ayuda es que un cajero ayude a los clientes de uno en uno, lo que generará importantes problemas de servicio al cliente para el banco.

Espero que esto ayude a ilustrar el problema que está preguntando. No es posible garantizar que los mensajes se manejen en orden en todos los casos posibles, dado que tiene múltiples consumidores. No importa si tiene múltiples colas, múltiples consumidores exclusivos, diferentes corredores, etc. - no hay forma de garantizar a priori que los mensajes se respondan en orden con múltiples consumidores. Pero RabbitMQ hará un mejor esfuerzo.

Necesito elegir un nuevo agente de Queue para mi nuevo proyecto.

Esta vez necesito una cola escalable que admita pub / sub, y mantener el orden de los mensajes es imprescindible.

Leí el comentario de Alexis: Él escribe:

"De hecho, creemos que RabbitMQ proporciona un orden más fuerte que Kafka"

Leí la sección de pedidos de mensajes en los documentos de rabbitmq:

"Los mensajes pueden devolverse a la cola utilizando métodos AMQP que tienen un parámetro de repetición (basic.recover, basic.reject y basic.nack), o debido a un cierre de canal mientras se mantienen mensajes no reconocidos ... Con la versión 2.7.0 y posterior aún es posible que los consumidores individuales observen mensajes fuera de servicio si la cola tiene múltiples suscriptores. Esto se debe a las acciones de otros suscriptores que pueden volver a colocar los mensajes. Desde la perspectiva de la cola, los mensajes siempre se mantienen en el orden de publicación. "

Si necesito manejar los mensajes según su orden, solo puedo usar rabbitMQ con una cola exclusiva para cada consumidor.

¿Todavía se considera que RabbitMQ es una buena solución para la cola de mensajes ordenados?


Creo que hay dos cosas en esta pregunta que no son similares, orden de consumo y orden de procesamiento.

Message Queues puede, hasta cierto punto, garantizarle que los mensajes se consumirán en orden, sin embargo, no le pueden dar garantías sobre el orden de su procesamiento.

La principal diferencia aquí es que hay algunos aspectos del procesamiento de mensajes que no se pueden determinar en el momento del consumo, por ejemplo:

  • Como se mencionó, un consumidor puede fallar durante el procesamiento, aquí el orden de consumo del mensaje era correcto, sin embargo, el consumidor no lo procesó correctamente, lo que hará que vuelva a la cola, y hasta ahora el orden de consumo sigue intacto, pero no lo hacemos. t saber cómo es la orden de procesamiento ahora

  • Si al "procesar" queremos decir que el mensaje se descarta y finaliza el procesamiento por completo, considere el caso cuando el tiempo de procesamiento no es lineal, es decir, procesar un mensaje lleva más tiempo que otro, así que si el mensaje 3 tarda más en procesarse que anticipado, entonces los mensajes 4 y 5 podrían consumirse y finalizar el procesamiento antes de que el mensaje 3 lo haga

Por lo tanto, incluso si lograra devolver el mensaje al principio de la cola (que, por cierto, infringe la orden de consumo), no puede garantizar que todos los mensajes antes del siguiente mensaje hayan terminado de procesarse.

Si quiere asegurarse el orden de procesamiento, entonces:

  1. Tener solo 1 instancia de consumidor en todo momento
  2. O no use una cola de mensajes y realice el procesamiento en un método de bloqueo sincrónico, que puede sonar mal, pero en muchos casos y los requisitos del negocio son completamente válidos y, a veces, incluso críticos.

El orden de los mensajes se conserva en Kafka, pero solo dentro de las particiones en lugar de globalmente. Si sus datos necesitan tanto pedidos globales como particiones, esto dificulta las cosas. Sin embargo, si solo necesita asegurarse de que todos los mismos eventos para el mismo usuario, etc. terminen en la misma partición para que estén correctamente ordenados, puede hacerlo. El productor está a cargo de la partición en la que escriben, por lo que si puede particionar lógicamente sus datos, puede ser preferible.