Notas para el consumidor de RabbitMQ
El cliente consumidor puede consumir mensajes en modo push y en modo pull.
Cuando la cola Rabbitmq tiene más de un consumidor, los mensajes recibidos por la cola se enviarán a los consumidores en forma de distribución circular. Cada mensaje solo se enviará a un consumidor de la lista de suscripción. Si la carga aumenta ahora, simplemente cree más consumidores para consumir y procesar mensajes.
Normalmente, el mecanismo de distribución de las encuestas no es tan elegante. De forma predeterminada, si hay n consumidores, RabbitMQ distribuirá el m-ésimo mensaje al m%n-ésimo (método restante) consumidor, y a RabbitMQ no le importará si el consumidor consume y confirma el mensaje (Basic .Ack). Imagínese si algunos consumidores están demasiado ocupados para consumir tantos mensajes, mientras que otros procesan los mensajes asignados rápidamente debido a alguna razón (como lógica de negocios simple, excelente rendimiento de la máquina, etc.), lo que hace que el proceso quede inactivo. el rendimiento general de la aplicación disminuirá.
Por ejemplo, antes de suscribirse a la cola de consumo, el programa de consumo llamará a channel.basicQos (5) y luego se suscribirá a una cola para consumirlo; RabbitMQ mantendrá una lista de consumidores y calculará el consumo de; cada mensaje enviado número de personas. Si se alcanza el límite, RabbitMQ ya no enviará ningún mensaje a ese consumidor. Si se alcanza el límite, RabbitMQ ya no enviará ningún mensaje al consumidor hasta que el consumidor reconozca el mensaje, momento en el que RabbitMQ disminuye el recuento en 1 y el consumidor puede continuar recibiendo mensajes hasta que se alcance nuevamente el límite.
Otro aspecto digno de mención de channel.basicQos es su método sobrecargado.
Cuando global es verdadero, es el límite superior del número de mensajes no reconocidos para todos los consumidores en la suma del canal p>
Cuando es falso, es el límite superior de un solo consumidor
Por ejemplo, si el canal tiene una colección
entonces cada consumidor puede enviarle al consumidor Hay un límite superior en la cantidad de mensajes no confirmados para cada usuario.
El número máximo de mensajes no reconocidos que un consumidor puede recibir es 3, y el número máximo de mensajes no reconocidos que un consumidor puede recibir es 5.
Si no lo necesita, es mejor usar la configuración global=false, que también es la predeterminada.
La secuencia de mensajes significa que los mensajes consumidos por el consumidor están en el mismo orden que los mensajes publicados por el remitente.
Si el productor publica mensajes en el formato msg1 msg2 msg3, entonces el consumidor debe consumir los mensajes en el mismo orden de msg1 msg2 msg3.
En las siguientes situaciones, el orden de los mensajes se destruirá:
1. Si el productor utiliza el mecanismo de transacción y encuentra una excepción después de enviar el mensaje y realiza una reversión de la transacción, Luego necesita enviar el mensaje nuevamente de forma compensatoria, y si el envío de compensación se implementa en otro hilo, los mensajes estarán desordenados en la fuente del productor.
2. De manera similar, si la confirmación del editor está habilitada y se produce un tiempo de espera o una interrupción, o se recibe un comando RabbitMQ Basic.Nack, también se requiere un envío de compensación, lo que genera los mismos resultados desordenados. como mecanismo de transacción. O, y esto es un poco exagerado, podemos asumir obstinadamente que las garantías de ordenación de mensajes comienzan después de que el mensaje se pone en cola, no cuando se envía.
3. Considere otra situación: si el mensaje enviado por el productor tiene un tiempo de espera diferente y también se establece una cola de mensajes inactivos (generalmente equivalente a una cola de retraso), cuando el consumidor consume el retraso Cuando Al poner en cola, el orden de los mensajes debe ser inconsistente con el orden de los mensajes enviados por el productor. Utilice Basic.Nack/.Reject para rechazar mensajes, por ejemplo:
Si una cola se divide en cuatro mensajes: msg1, msg2, msg3 y msg4 en orden, tanto el ConsumidorA como el ConsumidorB están suscritos a esta cola. La información en la cola se sondea y distribuye a cada consumidor, el consumidor A recibe msg1 y msg3, y el consumidor B recibe msg2 y msg4.
Después de que el consumidor A recibe el mensaje msg1, lo rechaza sin procesarlo, llama a Basic.Nack/.Reject y establece la cola en verdadero. Después de que el consumidor B recibe el mensaje msg1, llama a Basic.Nack/.Reject y establece requeue en verdadero para volver a colocar el mensaje en la cola. Luego, el mensaje msg1 se envía al ConsumidorB y el ConsumidorB ha consumido msg2, msg4 y luego msg1, por lo que el orden de los mensajes es incorrecto. O reenvíe el mensaje msg1 al consumidor A. El consumidor A consumió msg3 y luego consumió msg1, que también está fuera de secuencia.
QueueingConsumer también incluye (pero no se limita a) los siguientes defectos:
En términos generales, el middleware de mensajería tiene tres capas de garantías de mensajería.
Rabbitmq admite al menos una vez y como máximo una vez.
Al menos una vez:
(1) El productor del mensaje debe activar el mecanismo de transacción o el mecanismo de confirmación del editor para garantizar que el mensaje se pueda transmitir de manera confiable a RabbitMQ.
(2) Los productores de mensajes deben utilizar parámetros obligatorios o intercambiadores de respaldo junto con los productores de mensajes para garantizar que los mensajes puedan enrutarse desde el intercambio a la cola y guardarse en la cola en lugar de descartarse.
(3) Tanto los mensajes como las colas deben persistir para garantizar que el servidor RabbitMQ no pierda mensajes cuando encuentre excepciones.
(4) Los consumidores deben confirmar automáticamente cuando consumen mensajes Establecer en false y luego confirme manualmente los mensajes consumidos correctamente para evitar la pérdida innecesaria de mensajes por parte del consumidor.
Como máximo una vez:
El productor puede enviar tantos mensajes como quiera y el consumidor puede consumir tantos mensajes como quiera, pero es difícil garantizar que el mensaje no se perderá
Exactamente una vez:
Exactamente una vez es algo que RabbitMQ actualmente no puede garantizar.