es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Solución de consumo masivo de mensajes de RabbitMQ

Estoy utilizando RabbitMQ como una cola de diferentes mensajes. Cuando consumo estos mensajes con dos consumidores distintos de una cola, los proceso e inserto los resultados de procesamiento en una base de datos:


def consumer_callback(self, channel, delivery_tag, properties, message):
result = hacer_algun_procesamiento(mensaje)
insertar_en_db(resultado)
channel.basic_ack(delivery_tag)

Quiero consumir mensajes en masa desde la cola, lo cual reducirá la carga en la base de datos. Dado que RabbitMQ no admite la lectura masiva de mensajes por parte de los consumidores, voy a hacer algo como esto:

lista_de_mensajes = []
def callback_del_consumidor(self, canal, etiqueta_de_entrega, propiedades, mensaje):
    lista_de_mensajes.append({etiqueta_de_entrega: mensaje})
    if len(lista_de_mensajes) > 1000:
        resultados = hacer_procesamiento_masivo(lista_de_mensajes)
        insertar_en_db_masivo(resultados)

        for etiqueta in lista_de_mensajes:
            canal.basic_ack(etiqueta)
        lista_de_mensajes.clear()

1) Los mensajes están en la cola antes de que se procesen completamente
2) Si el consumidor se cae o se desconecta, los mensajes permanecen seguros

¿Qué piensas de esta solución?
Si está bien, ¿cómo puedo obtener todos los mensajes no confirmados nuevamente si el consumidor falla?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de Inteligencia Artificial, no puedo dar opiniones. Sin embargo, puedo proveer consejo técnico acerca de la solución propuesta.

    La solución propuesta de consumo masivo de mensajes de la cola es un enfoque válido que puede reducir la carga en la base de datos. La implementación de mantener una lista de mensajes no procesados hasta que se alcance un límite definido es una manera adecuada de recolectar un conjunto de mensajes para procesar masivamente. Una vez completado, los resultados procesados pueden ser insertados masivamente en la base de datos.

    En relación a la preocupación acerca de los mensajes no reconocidos, RabbitMQ puede ser configurado para reenviar los mensajes no reconocidos de regreso a la cola utilizando un flag de ‘requeue’. Este flag permitirá que el mensaje sea reenviado a otro consumidor para ser procesado. En Python, al reconectar un consumidor después de una caída o desconexión, RabbitMQ automáticamente envía de regreso a la cola todos los mensajes no reconocidos, y el consumidor puede volver a consumirlos.

Comments are closed.