Cuando el consumidor recibe el mensaje y la tarea de procesamiento se completa, enviará un ack con este identificador de mensaje para informar al servidor de que el mensaje ha sido recibido y que el procesamiento está completado. RabbitMQ espera a que se pierda el enlace del consumidor que procesa un mensaje antes de determinar que el mensaje no se ha procesado correctamente, por lo que RabbitMQ retransmite el mensaje. El acuse de acuse de recibo está desactivado por defecto. Existe un parámetro noAck al inicializar Consumidor,Si se configura como verdadero, el consumidor devolverá un ack tan pronto como reciba el mensaje。
En términos generales, el escenario comúnmente utilizado como noack se establece como válido, pero para proyectos con requisitos de alto riesgo, como el pago. Para cada mensaje, debemos garantizar su integridad y corrección. Después de recibir el mensaje, necesitas confirmar que la lógica de negocio correcta está ejecutada y luego devolver activamente un ack al servidor. Puedes ver los mensajes en la cola a través del comando rabbitmqctl list_queues nombre message_rady message_unacknowleded, o a través de la interfaz de gestión en segundo plano.
Si noAck está configurado como falso, el cliente debe enviar activamente un ack al servidor, y si el cliente no confirma el mensaje, ocurrirá la siguiente situación:
Mientras el programa siga en ejecución, estos 10 mensajes permanecen sin ser detectados y no pueden ser reentregados por RabbitMQ. Lo que es aún más poderoso es queEl consumo de mensajes de RabbitMQ no tiene un mecanismo de tiempo de espera, es decir, si el programa no se reinicia, el mensaje siempre estará en estado Uncked. No olvides estos mensajes de estado descontrolado cuando trabajes en eventos operativos.
Listo
Los mensajes con este estado existen en la cola para ser procesados.
No reconocido
Un mensaje en este estado indica que ya está siendo procesado pero no se ha confirmado.
Cuando el programa está cerrado (mientras el Consumidor esté cerrado), estos 10 mensajes volverán al estado Listo.
Mensaje de confirmación
¿Y si el cliente envía un ack al servidor? Es decir, ¿confirmar la recepción del mensaje? El código es el siguiente:
Cuando el segundo parámetro del método BasicAck, multiple, se pone en false, significa que RabbitMQ recibe notificación de que el mensaje actual ha sido reconocido.Si es cierto, se reconocerá un mensaje adicional menor que la etiqueta de entrega especificado por el primer parámetro。 (La confirmación masiva es para todo el canal)
Cancelar confirmación
¿Qué pasa si uno de los clientes del programa distribuido tiene una excepción y quiere cancelar la confirmación del mensaje y dejar que otros clientes procesen el mensaje?
Cuando hay una excepción en el mensaje de consumo, necesitamos cancelar la confirmación y entonces podemos usar el método basicReject de Channel.
El primer parámetro especifica la etiqueta de entrega, y el segundo parámetro describe cómo manejar este mensaje de fallo.Un valor de verdadero significa que el mensaje se vuelve a poner en la cabecera de la cola, y un valor de falso significa que el mensaje está abandonado。
|