MongoDB作为队列,上限集合+ tailable游标

时间:2012-08-22 20:52:32

标签: c# mongodb message-queue

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

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

  1. 我可以对光标使用任何排序顺序吗?
  2. 拖尾光标是否与过滤查询一起工作(跳过一些我不想处理的文件)?如果是这样,它如何处理新文件的插入 - 只有在新文件符合查询标准时我才会收到通知吗?
  3. C#驱动程序是否完全支持拖尾游标?
  4. 我喜欢我的队列以保证单次投递 - 我的意思是如果两个客户尝试阅读来自同一个集合的消息,他们就不应该能够消费这些消息。同样的消息。我认为这可以通过findAndModify实现,但如何使用拖尾光标来实现?
  5. 由于 RG

1 个答案:

答案 0 :(得分:9)

AOL / About.me在2012年4月的硅谷MUG上发表了关于“MongoDB as message queue”的演讲,您可能会发现有助于规划您的方法。

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

一个tailable光标会对有顶集合的 end 进行尾随,并且只按自然顺序排列。如果您需要排序顺序,则需要使用索引查询。

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

  

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

是的,在1.1 C#驱动程序中实现了tailable游标支持(请参阅:code example)。

  

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

有几种方法:

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

有关原子操作的更多信息,请参阅MongoDB手册中的Isolate Sequence of Operations