6

(在 mongo-user 讨论组https://groups.google.com/d/topic/mongodb-user/i1ge4bNiMgM/discussion上询问)

嗨,我想将 MongoDB 用作消息队列,并考虑为此目的使用上限集合 + 可尾游标。我知道可尾光标可用于按插入顺序访问文档,但是

  1. 我可以对光标使用任何排序顺序吗?
  2. 拖尾光标是否与过滤器查询一起使用(跳过一些我不想处理的文档)?如果是这样,它如何处理新文档的插入 - 只有当新文档符合查询条件时才会通知我?
  3. C# 驱动程序是否完全支持尾随游标?
  4. 我希望我的队列保证单次传递 - 我的意思是如果两个客户端尝试从同一个集合中读取消息,他们不应该能够“消费”相同的消息。我认为这可以通过 findAndModify 来实现,但是如何使用尾随光标来实现呢?

谢谢 RG

4

1 回答 1

9

AOL/About.me 于2012 年 4 月在硅谷 MUG上发表了关于“将 MongoDB 作为消息队列”的演讲,您可能会发现它有助于规划您的方法。

  1. 我可以对光标使用任何排序顺序吗?
  2. 拖尾光标是否与过滤器查询一起使用(跳过一些我不想处理的文档)?如果是这样,它如何处理新文档的插入 - 只有当新文档符合查询条件时才会通知我?

可尾游标尾随封顶集合的末尾,并且仅以自然顺序排列。如果您想要排序顺序,则需要使用索引查询。

请阅读Create Tailable Cursor文档页面以获取更多信息。

C# 驱动程序是否完全支持尾随游标?

是的,可尾游标支持是在 1.1 C# 驱动程序中实现的(参见:代码示例)。

我希望我的队列保证单次传递 - 我的意思是如果两个客户端尝试从同一个集合中读取消息,他们不应该能够“消费”相同的消息。我认为这可以通过 findAndModify 来实现,但是如何使用尾随光标来实现呢?

有几种方法:

  • 让一个带有可尾光标的阅读器将任务分配给工作线程(即基于工作队列深度或循环)。这将比拥有多个阅读器更有效,但可能会出现单点故障。
  • (@Contango 在下面的评论中建议)拥有多个阅读器,但使用乐观并发确保只有一个工作人员“拥有”每个任务。这将导致更多的 I/O,但如果工作人员也直接拖尾,则可能会简化您的设计。

有关原子操作的更多信息,请参阅MongoDB 手册中的隔离操作序列。

于 2012-08-23T06:58:08.080 回答