2012-08-28 22 views
12

Tal vez estoy siendo tonto al hacer la pregunta, pero necesito entender bien los conceptos básicos antes de seguir trabajando.Apio: ¿un mensaje en RabbitMQ puede ser consumido por dos o más trabajadores al mismo tiempo?

Estoy procesando unos pocos miles de feeds RSS, usando varios nodos de trabajadores de Apiler y un nodo RabbitMQ como intermediario. La URL de cada feed se escribe como un mensaje en la cola. Un trabajador simplemente lee la URL de la cola y comienza a procesarla. Tengo que asegurarme de que una sola fuente RSS no sea procesada por dos trabajadores al mismo tiempo.

El artículo Ensuring a task is only executed one at a time sugiere una solución basada en Memcahced para bloquear el avance cuando se está procesando.

Pero lo que intento comprender es por qué necesito usar Memcached (u otra cosa) para asegurar que un mensaje en una cola de RabbitMQ no sea consumido por varios trabajadores al mismo tiempo. ¿Hay algún cambio de configuración en RabbitMQ (o Aplery) que pueda hacer para lograr este objetivo?

+1

Hay una diferencia entre tener que bloquear los mensajes y bloquear los feeds. ¿Qué necesitas hacer? –

+0

@PlatinumAzure - ¿te importa explicar un poco?Necesito bloquear el mensaje (si eso significa asegurarse de que no sea consumido por varios trabajadores). – rubayeet

Respuesta

4

Según lo observado por otros, está mezclando manzanas y naranjas.

Al ser una tarea de apio y un mensaje de MQ.

Puede asegurarse de que un mensaje sea procesado por un solo trabajador al mismo tiempo.

por ejemplo.

@task(...) 
def my_task(

my_task.apply(1) 

la .apply publica un mensaje al intermediario de mensajes que está utilizando (conejo, Redis ...). A continuación, el mensaje será enviado a una cola y consumido por un trabajador cada vez. no necesita bloqueo para esto, lo tiene gratis :)

El ejemplo en el libro de recetas de apio muestra cómo evitar que dos mensajes como ese (my_task.apply (1)) se ejecuten al mismo tiempo, esto es algo debe asegurarse dentro de la tarea misma.

Necesita algo a lo que pueda acceder desde todos los trabajadores, por supuesto (memcached, redis ...) ya que podrían estar ejecutándose en máquinas diferentes.

2

Ejemplo mencionado normalmente utilizado para otro objetivo: le impide trabajar con diferentes mensajes con el mismo significado (no el mismo mensaje). Por ejemplo, tengo dos procesos: el primero pone en cola algunas URL, y el segundo: toma la URL de la cola y la busca. ¿Qué sucederá si el primer proceso pone en cola una URL dos veces (o incluso más veces)?

P.S. Uso para este propósito el almacenamiento Redis y el funcionamiento setnx (que puede establecer la clave una sola vez).

5

Un solo mensaje de MQ ciertamente no será visto por múltiples consumidores en una configuración de trabajo normal. Tendrás que trabajar un poco para los casos que implican fallas/colisiones de trabajadores, leer en autoacks y rechazos de mensajes, pero el caso básico es el sonido.

No veo una cola sincronizada (léase: MQ) en el artículo que ha vinculado, entonces (hasta donde puedo decir) están usando el mecanismo de bloqueo (léase: memcache) para sincronizar, como una alternativa. Y puedo pensar en algunos problemas que no estarían allí en una configuración de MQ adecuada.

Cuestiones relacionadas