Tenemos un microservicio que consume (suscribe) mensajes de más de 50 colas de RabbitMQ.
La producción de mensajes para esta cola ocurre en dos lugares
El proceso de la aplicación cuando encuentra una lógica comercial de ejecución retrasada (como enviar correos electrónicos O notificar a otro servicio), la aplicación envía directamente el mensaje al intercambio (que a su vez se envía a la cola).
Cuando nos encontramos con una lógica empresarial de ejecución larga/retrasada, tenemos una tabla de messages que tiene entradas de mensajes que deben ejecutarse después de un tiempo.
Ahora tenemos un trabajador cron que se ejecuta cada 10 minutos, escanea la tabla de messages y envía los mensajes a RabbitMQ.
Digamos que la tabla de mensajes tiene 10 000 mensajes que se pondrán en cola en la próxima ejecución del cron,
1 Min en completarse.Nota: los suscriptores que consumen los mensajes son idempotentes, por lo que no hay problema en el procesamiento duplicado
Puedo tener 4 estados (RequiresQueuing, Queued, Completed, Failed)
RequiresQueuingQueuedCompleted / Failed .Hay un problema con la lógica anterior, digamos que RabbitMQ de alguna manera se cae O en algún uso hemos purgado la cola para el mantenimiento.
Ahora los mensajes que están marcados como En Queued están en un estado incorrecto, porque deben identificarse nuevamente y el estado debe cambiarse manualmente.
Digamos que tengo el nombre RabbitMQ Queue (eventos)
Esta cola de eventos tiene 5 suscriptores, cada uno de los suscriptores recibe 1 mensaje de la cola y publica este evento utilizando la API REST en otro microservicio (agregador de eventos). Cada llamada a la API suele tardar 50 ms.
Caso de uso:
Ahora la pregunta es: si sigue enviando los mensajes a la cola de eventos, solo está inflando la cola.
https://www.rabbitmq.com/memory.html : mientras leía esta página, descubrí que rabbitmq ni siquiera aceptará la conexión si alcanza una fracción de marca de agua alta (el valor predeterminado es 40%). Por supuesto, esto se puede cambiar, pero esto requiere una intervención manual.
Entonces, si la longitud de la cola aumenta, afecta la memoria de rabbitmq, esa es la razón por la que pensé en acelerar a nivel del productor.
Gracias por adelantado.
Verifique la respuesta aceptada Comentarios para la limitación usando queueCount
Puede combinar QoS - (Calidad de servicio) y ACK manual para solucionar este problema. Su escenario exacto está documentado en https://www.rabbitmq.com/tutorials/tutorial-two-python.html . Este ejemplo es para python, también puede consultar otros ejemplos.
Digamos que tiene 1 editor y 5 scripts de trabajo. Digamos que estos leen de la misma cola. Cada script de trabajador tarda 1 minuto en procesar un mensaje. Puede configurar QoS a nivel de canal. Si lo establece en 1, en este caso, a cada script de trabajador se le asignará solo 1 mensaje. Así que estamos procesando 5 mensajes a la vez. No se entregarán nuevos mensajes hasta que uno de los 5 scripts de trabajo haga un ACK MANUAL.
Si desea aumentar el rendimiento del procesamiento de mensajes, puede aumentar el número de nodos trabajadores.
La idea de actualizar las tablas en función del estado del mensaje no es una buena opción, el sondeo de la base de datos es la razón principal por la que el sistema usa colas y causaría un problema de escala. En un momento, debe actualizar las tablas y se produciría un cuello de botella debido a los niveles de bloqueo y aislamiento.