MongoDB作为队列服务?

Avi*_*uya 37 social queue mongodb web

我很想听到有关MongoDB作为队列服务的真实应用程序体验的更多信息,如果您为此目的使用MongoDB,您可以分享您的想法,以及它的使用环境吗?

And*_*ich 42

我使用mongodb作为电子邮件发送的队列服务.很快它将以下列方式工作:

  1. 当有新消息出现时,我将它存储在mongodb中.
  2. 后台作业然后通过原子操作findAndModify从mongodb加载消息并将标志设置Processing为true,因此它不会处理相同的消息两次(因为我的后台作业并行运行多个线程).
  3. 电子邮件发送后,我将从mongodb中删除该文档.
  4. 您还可以记录每条消息的失败次数,并在3次尝试失败后将其删除.

一般情况下,我使用mongodb作为队列服务只是出于一个原因:因为我需要按指定的时间表发送电子邮件(每条消息都包含有关应该发送的时间的信息).

如果您没有任何计划并且需要立即处理消息,我建议您查看现有的队列服务,因为它们可能会处理您在没有更深入了解消息队列时可能看不到的所有情况.

更新

当后台作业在消息处理期间崩溃时,您可以执行以下操作:

  1. 将此消息移动到另一个消息队列错误集合或..

  2. 在邮件中增加处理尝试计数器并再次分配状态"新建",以尝试再次处理它.只需确保后台作业是幂等的(可以多次处理相同的消息而不是损坏数据)和事务性(当作业失败时,您必须撤消所做的更改.如果有的话).5次尝试(配置值)后作业失败时执行#1.

  3. 一旦修复了消息处理的错误,您可以通过分配"新"状态并移动到消息队列再次处理它,或者只删除此消息.它实际上取决于业务流程.

  • 这个.在MongoDB而不是专用MQ上构建它的另一个动机是它可以使您不必在应用程序中与另一个服务进行交互.唯一的主要问题是吞吐量低于为目的设计的MQ. (3认同)
  • 我也一直在寻找一个关于Mongo的好Q问题.如果您的后台作业在将Processing标志设置为true但在它可以处理消息之前崩溃或重新启动,您会怎么做? (2认同)
  • @cirrus这也是我想知道的事情.我打算区分三种状态(NEW/IN PROGRESS/DONE)并保持最后修改日期/时间.然后,新工作人员(或专用的garbace gollector)可以开始寻找具有过去最后修改时间的消息"IN PROGRESS",然后将这些消息重置为"NEW". (2认同)

Fer*_* To 5

我知道这个问题是从2012年开始的,但是在我自己的研究中我发现了这篇文章并且只是想告诉任何其他用户,来自serverdensity的开发人员取代了rabbitmq,转而选择了一个简单的mongodb排队系统.

这里给出了详细的文章:

https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/

  • 我们已经达到了MongoDB中原子findAndModify操作的极限并转移到了Kafka:https://blog.serverdensity.com/server-alerts-a-step-by-step-look-behind-the-scenes/ (4认同)