Pregunta ¿Cómo configuro una cantidad de intentos de reintento en RabbitMQ?


Estoy usando RabbitMQ y tengo una cola que contiene mensajes de correo electrónico. Mi servicio al consumidor elimina los mensajes e intenta enviarlos. Si, por algún motivo, mi consumidor no puede enviar el mensaje, me gustaría volver a ponerlo en cola para enviarlo nuevamente. Me doy cuenta de que puedo hacer un BasicNack y establecer que el indicador de reabastecimiento sea verdadero, sin embargo, no quiero volver a poner el mensaje indefinidamente (por ejemplo, si nuestro sistema de correo electrónico falla, no quiero volver a cargar continuamente los mensajes no enviados). Me gustaría definir un número finito de veces que puedo volver a colocar el mensaje para enviarlo nuevamente. Sin embargo, no puedo establecer un campo en el objeto de mensaje de correo electrónico cuando lo dequeo y envío un nack. El campo actualizado no está presente en el mensaje en la cola. ¿Hay alguna otra manera en que pueda abordar esto? Gracias por adelantado.


32
2018-04-18 16:39


origen


Respuestas:


No hay ninguna característica como los intentos de reintento en RabbitMQ (ni en el protocolo AMQP).

La posible solución para implementar el intento de reintento limita el comportamiento:

  1. Vuelva a enviar el mensaje si no se volvió a entregar anteriormente (consulte redelivered parámetro en basic.deliver método - su biblioteca debe tener alguna interfaz para esto) y soltarlo y luego atrapar intercambio de letra muerta, luego procesa de alguna manera.

  2. Cada vez que el mensaje no se puede procesar, publíquelo de nuevo, pero configure o incremente / disminuya el campo del encabezado, digamos x-redelivered-count (sin embargo, puedes elegir el nombre que quieras). Para tener control sobre las entregas nuevas, en este caso debe verificar el campo que establece si alcanza algún límite (arriba o abajo - 0 es mi elección, a-la ttl en encabezado ip desde tcp / ip).

  3. Almacene la clave única del mensaje (digamos uuid, pero debe configurarla manualmente cuando publique el mensaje) en Redis, Memcache u otro almacenamiento, incluso en mysql junto con el recuento de las entregas y luego en cada incremento / decremento de este valor hasta que alcance el límite .

  4. (para geeks geniales) escribir el plugin que implementará tal comportamiento como lo desee.

La prueba # 3 es que el mensaje reenviado se queda en el encabezado de la cola. Esto es importante si tiene una cola larga o si el orden de los mensajes es importante para usted (tenga en cuenta que las entregas interrumpirán el orden estricto de los mensajes, consulte los documentos oficiales para obtener detalles o esta pregunta en SO)

PD.: 

Ahi esta respuesta similar en este tema, pero en php. Míralo, tal vez te ayude un poco (comienza a leerlo de las palabras "Existen múltiples técnicas para lidiar con el problema de redistribución del ciclo".


43
2018-04-18 20:37