Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

363
Vistas
¿Cómo acelerar mi formulario de trabajador cron enviando mensajes a RabbitMQ?

Contexto:

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

  1. 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).

  2. 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.

Guión:

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. 9:00 a. m.: se ejecuta Cron Worker y pone en cola 10 000 mensajes en la cola de RabbitMQ.
  2. Tenemos suscriptores que escuchan la cola y comienzan a consumir los mensajes, pero debido a algún problema en el sistema o a un retraso en el tiempo de respuesta de terceros, cada mensaje tarda 1 Min en completarse.
  3. 9:10 a. m.: ahora, el trabajador cron vuelve a ejecutar los próximos 10 minutos y observa que todavía hay más de 9000 mensajes por completar y también se ha cruzado el tiempo, por lo que una vez más envía más de 9000 mensajes duplicados a la cola.

Nota: los suscriptores que consumen los mensajes son idempotentes, por lo que no hay problema en el procesamiento duplicado

Idea de diseño que tenía en mente pero no la mejor lógica

Puedo tener 4 estados (RequiresQueuing, Queued, Completed, Failed)

  1. Cada vez que se inserta un mensaje, puedo establecer el estado en RequiresQueuing
  2. A continuación, cuando el trabajador cron selecciona y envía los mensajes con éxito a la cola, puedo configurarlo en Queued
  3. Cuando los suscriptores completan, marcan el estado de la cola como Completed / 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.

Otro ejemplo

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:

  1. Debido a la alta carga, el número de eventos producidos se vuelve 3x.
  2. Además, el microservicio (agregador de eventos) que acepta el evento también se volvió lento en el procesamiento, el tiempo de respuesta aumentó de 50 ms a 1 minuto.
  3. Los trabajadores de Cron siguen su diseño mencionado anteriormente y ponen en cola el mensaje para cada minuto. Ahora la cola se está volviendo demasiado grande, pero tampoco puedo aumentar la cantidad de suscriptores porque el microservicio dependiente (agregador de eventos) también está retrasado.

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.

Preguntas

  1. ¿Cómo puedo acelerar mi trabajador cron para omitir esa ejecución en particular o de alguna manera inspeccionar la cola e identificar que ya está muy cargada para no enviar los mensajes?
  2. ¿Cómo puedo manejar los casos de uso que dije anteriormente? ¿Existe un diseño que resuelva mi problema? ¿Alguien se enfrentó al mismo problema?

Gracias por adelantado.

Responder

Verifique la respuesta aceptada Comentarios para la limitación usando queueCount

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda