mecanismo de acuse de recibo
ack
Automático y manual de acuse de recibo ACK dividido en dos clases
si acuse de recibo automático, hay dos inconvenientes:
- 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.
- 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 手动ack
respuesta
Manual de ACK
En general 手动ack
las 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 logic
es callback
que 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
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 qos
establecer 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