我很想听到有关MongoDB作为队列服务的真实应用体验的更多信息,如果你为此目的使用MongoDB,你可以分享你的想法,以及它的使用环境吗?
答案 0 :(得分:41)
我使用mongodb作为电子邮件发送的队列服务。 很快它将以下列方式工作:
Processing
设置为true,因此它不会处理相同的消息两次(因为我的后台作业运行多个线程)平行)。一般情况下,我将mongodb用作队列服务只是出于一个原因:因为我需要按指定的时间表发送电子邮件(每条消息都包含有关应该发送的时间的信息)。
如果您没有任何计划并且需要立即处理消息,我建议您查看现有的queue services,因为它们可能会处理您在没有更深入了解消息队列时可能看不到的所有情况。
当后台作业在邮件处理过程中崩溃时,您可以执行以下操作:
将此消息移至另一个消息队列错误集合或..
在邮件中增加处理尝试计数器并再次指定状态“新建”,以尝试再次处理它。只需确保后台作业是幂等的(可以多次处理相同的消息而不是损坏数据)和事务性(当作业失败时,您必须撤消所做的更改。如果有的话)。 5次尝试(配置值)后作业失败时执行#1。
修复了邮件处理错误后,您可以再次处理它,方法是指定“新建”状态并移至邮件队列,或者只删除此邮件。它实际上取决于业务流程。
答案 1 :(得分:5)
我知道这个问题是从2012年开始的,但在我自己的研究中,我发现这篇文章,并且只想告知任何其他用户,来自serverdensity的开发人员取代了rabbitmq,转而选择使用mongodb的简单排队系统。
这里给出了详细的文章:
https://blog.serverdensity.com/replacing-rabbitmq-with-mongodb/
答案 2 :(得分:3)
这是一个great article,解释了某人如何将mongoDB的复制oplog用作队列。
您可以对不同的集合执行相同操作。主要建议似乎是使用capped collection - mongo驱动程序可以有效地等待上限集合,以便客户端不会不断进行轮询。
答案 3 :(得分:1)
几年来,我一直在完善Redis和/或mongodb之上的作业队列的实现,并为负载平衡和HA提供了不错的支持。我决定将node.js用于实现,这似乎非常合适。我想出了两个实体:
一个node.js库(https://pepmartinez.github.io/keuss/),能够在redis和mongodb之上管理队列和集群。它还通过将对mongodb的读取和写入存储在桶中,在mongodb上提供了一个队列实现,以突破findAndModify限制
也是用node.js(https://pepmartinez.github.io/keuss-server/)制成的服务器,该服务器基本上在node.js库的顶部提供了STOMP和REST Iterfaces。该服务器可以看作是SQS之类的替代品
该库显然仅限于node.js,但是几乎可以说HTTP的任何东西都可以使用该服务器
答案 4 :(得分:0)
我经常搜索并找到了JavaScript版本https://github.com/chilts/mongodb-queue。但我想要一个版本,所以 Go中的一个简单实现,包括一个用于轮询消息的管理器:https://github.com/justmao945/mongomq
答案 5 :(得分:0)
这是一个简单的消息队列implementation。
它是article的一部分,用于评估各种消息队列系统的性能。
单线程单节点设置可实现7 900 msgs / s的发送和1 900 msgs / s的接收。
答案 6 :(得分:0)
这是我的Python implementation of PubSub / queue 它可以通过在上限集合上拖尾光标或轮询普通集合来工作。 使用它的一些项目,我想简化我的堆栈,取得了非常好的结果。当然,正如有人提到的那样,直到你达到原子findAndModify的极限,但这可以通过各种技术来处理