RabbitMQ cola de acuse de recibo de mensajes y causa problemas de obstrucción Nack circulatorios, y la muerte

mecanismo de acuse de recibo

ackAutomático y manual de acuse de recibo ACK dividido en dos clases
si acuse de recibo automático, hay dos inconvenientes:

  1. El agente de MQ sólo tiene que verificar el mensaje de éxito, el mensaje será descartado sin esperar una respuesta, lo que hace que el mensaje al consumidor si el cliente aún no ha sido procesado, el mensaje se pierde cuando la alimentación es anormal o consecuencias.
  2. Sin acuse de recibo automático qos控制, los consumidores pueden recibir demasiados clientes porque el servicio de mensajería instantánea llevó a colgar

Tan común es la 手动ackrespuesta

Manual de ACK

En general 手动acklas operaciones de procesamiento de la lógica de la siguiente manera:

try {
    //do logic   
    if(success) {
            //手动ack应答
            $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
        }
} catch (Exception $e) {
	echo "wrong";
	//log
}

A primera vista no es ningún problema, pero si lo anterior logices callbackque hay Bug, causaría todos los mensajes son arrojados, a continuación, la cola de Unacked消息数subida, lo que lleva a MQ responden más lentamente, y luego se cae
Introduzca una descripción de la imagen

La razón: Debido a la devolución de llamada anterior se produce una excepción, así que no se ack respuesta MQ Nota: Estos mensajes pueden acumularse en las noticias en Unacked, no abandonar, incluso abrir otra consumo de los consumidores no será hasta que el cliente consumidor original cuándo desconectar y volver a conectar, se convertirá en listo, entonces si por qosestablecer prefetch, no hay respuesta ACK, entonces, Broker no redistribución nuevo mensaje hacia abajo, lo que lleva a la obstrucción

mecanismo de Nack

nack¿Qué es? De hecho, se informará a la parte trasera de cola de mensajes MQ en la cabeza (no la cola), en lugar de convertirse Unacked, por lo que los consumidores pueden obtener el cliente directamente a este mensaje.
Pero el problema de nuevo, la devolución de llamada arriba si hay un problema que incluso de nuevo en el primer equipo, la próxima vez que el consumo, o está dando, fue enviado de vuelta al primer equipo, de manera que un bucle sin fin de

resumen

Para resolver los problemas anteriores es la mejor manera:

try {
    //do logic   
} catch (Exception $e) {
   Log.Info($msg)
} finally {
   //最终怎样都手动ack应答
   $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
}

Independientemente de si hay una excepción, debe ACK, con la excepción se produce cuando la diferencia entre los primeros mensajes a una tabla de datos de captura récord, a continuación, ACK, y finalmente otra consumo unitario de estos mensajes no

Publicado 48 artículos originales · ganado elogios 56 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/zhetmdoubeizhanyong/article/details/103223777
Recomendado
Clasificación