una - MongoDB como un servicio de cola?
mongodb relaciones (6)
Aquí está mi implementación en Python de PubSub / queue Funciona con un cursor de cola en una colección con tope o en una colección normal. Usé algunos proyectos en los que quería simplificar mi stack con resultados bastante buenos. Por supuesto, como alguien ya lo mencionó hasta que llegaste a los límites del atómico findAndModify, pero eso puede solucionarse con varias técnicas
Me gustaría saber más acerca de la experiencia real de aplicaciones con MongoDB como un servicio de cola, si usa MongoDB para este propósito, ¿podría compartir sus ideas, así como el entorno en el que se utilizó?
Aquí hay un excelente artículo explicando cómo alguien usó el oplog de replicación de mongoDB como una cola.
Puedes hacer lo mismo con una colección diferente. El consejo principal parece ser utilizar una colección con tope : los controladores mongo tienen medios eficientes de esperar en una colección con tope para que el cliente no esté constantemente sondeando.
Aquí hay una implementation simple de cola de mensajes.
Es una parte del article que evalúa el rendimiento de una variedad de sistemas de cola de mensajes.
Una configuración de un solo hilo y un solo nodo logra 7 900 msgs / s enviados y 1 900 msgs / s recibidos.
Estoy usando mongodb como un servicio de cola para el envío de correo electrónico. Pronto funcionará de la siguiente manera:
- Cuando llega un mensaje nuevo, lo guardo en el mongodb.
- Un trabajo en segundo plano carga el mensaje de mongodb a través de la operación atómica findAndModify y establece el
Processing
del indicador en verdadero, por lo que no procesa el mismo mensaje dos veces (porque mi trabajo en segundo plano ejecuta varios hilos en paralelo). - Una vez que se envió el correo electrónico, eliminé el documento de mongodb.
- También puede llevar el recuento de las fallas de cada mensaje y eliminarlo luego de 3 intentos fallidos.
En general, uso mongodb como un servicio de cola solo por una razón: porque necesito enviar correos electrónicos según la programación especificada (cada mensaje contiene información sobre la hora a la que se debe enviar).
Si no tiene ningún cronograma y necesita procesar el mensaje de inmediato, le sugiero que investigue los servicios de colas existentes, ya que probablemente manejen todos los casos que no pueda ver sin una comprensión más profunda de las colas de mensajes.
Actualizar
Cuando el trabajo en segundo plano se cuelga durante el procesamiento del mensaje, puede hacer lo siguiente:
Mueva este mensaje a otro, colección de errores de la cola de mensajes o ...
Aumente el contador de intentos de procesamiento en un mensaje y vuelva a asignar el estado "Nuevo" para intentar procesarlo nuevamente. Solo asegúrese de que el trabajo en segundo plano sea idempotente (puede procesar el mismo mensaje varias veces y no datos corruptos) y transaccional (cuando falla la tarea, debe deshacer los cambios realizados, si corresponde). Cuando el trabajo falla después de 5 intentos (valor de configuración), realice el # 1.
Una vez que se corrigió el error con el procesamiento de mensajes, podría procesarlo nuevamente asignando el estado "Nuevo" y moviéndose a la cola de mensajes, o simplemente borrando este mensaje. Depende de los procesos comerciales en realidad.
He buscado mucho y he encontrado la versión de JavaScript https://github.com/chilts/mongodb-queue . Pero quiero una versión go, por lo que se realizó una implementación simple en Go, que incluye un administrador para sondear los mensajes: https://github.com/justmao945/mongomq
Sé que esta pregunta se remonta a 2012, pero durante mi propia investigación encontré este artículo y solo quiero informar a cualquier otro usuario que los desarrolladores de serverdensity reemplazaron a rabbitmq en favor de un simple sistema de colas con mongodb.
Un artículo detallado se da aquí:
https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/