2011-09-24 15 views
5

Estoy construyendo un sistema de colas que pasa un mensaje de un proceso a otro a través de una pila implementada en mongodb con capped_collections y cursores disponibles.Pregunta sobre mongodb capped collections + tailable cursores

La recepción procesa bucles buscando infinitamente documentos nuevos en capped_collection, y cuando encuentra uno, realiza una operación.

Mi pregunta es, si implemento múltiples procesos de recepción ¿hay alguna forma de garantizar que un documento nuevo solo se leerá una vez mediante uno de los procesos utilizando un cursor de disponibilidad? El objetivo es evitar que la operación se realice dos veces si hay dos procesos de recepción buscando nuevos mensajes en la cola. Soy relativamente nuevo en la programación de mongodb, así que sigo sintiendo todas sus características.

Respuesta

2

MongoDB documents contienen una descripción detallada de las formas de lograr una actualización atómica. No puede asegurarse de que solo un proceso reciba el documento nuevo, pero puede implementar una actualización atómica después de recibirlo para garantizar que solo un proceso actúe sobre él.

+0

La pregunta se trataba de garantizar que dos cursores competentes no recibieran el mismo mensaje. No veo cómo esto tiene algo que ver con las actualizaciones atómicas o el enlace de documentación que proporcionó – mysomic

+0

¿Ha votado negativamente porque no entiende la respuesta * aceptada? Quizás * usted * no entiende cómo usar las actualizaciones atómicas para "evitar que la operación se realice dos veces", pero la persona que hizo la pregunta claramente lo hizo. Bonito. –

+1

Entiendo la pregunta y su respuesta. Las actualizaciones atómicas no * "garantizan que un documento nuevo solo se leerá una vez mediante uno de los procesos que utilizan un cursor disponible" * en el sentido de que ambos consumidores ** ** recibirán el mismo documento. Cómo se coordinan después de que ambos reciban un documento de cola duplicado es otro asunto completamente diferente y tal vez las actualizaciones atómicas podrían estar involucradas de alguna manera. El hecho de que es la respuesta aceptada es irrelevante para que sea la correcta. – mysomic

0

Recientemente he estado investigando este problema y me gustaría saber si hay otras maneras de tener varios lectores (consumidores) sin depender de actualizaciones atómicas.

Esto es lo que he encontrado: divida su lógica en dos "módulos". El primer módulo será responsable de obtener nuevos documentos del cursor de disponibilidad. El segundo módulo será responsable de trabajar con un documento arbitrario. De esta manera, puede tener solo un consumidor (módulo uno) buscando documentos que luego envían el documento a varios trabajadores del documento (segundo módulo).

Ambos módulos se pueden implementar en diferentes procesos e incluso en diferentes idiomas. Por ejemplo, una aplicación Node.js podría recuperar los documentos y enviarlos a un grupo de scripts escritos en Python, listos para procesar documentos al mismo tiempo.

+0

Parece que le puede interesar Gearman. http://gearman.org/ –