2012-08-28 205 views
1

我不知道是否有可能创建一个与MongoDB和红宝石(mongoid)的FIFO队列。MongoDB FIFO与红宝石队列

我想使用加盖的集合,但我看不到如何弹出我的队列。 collection似乎没有办法做到这一点。

我在做什么现在的问题是:

$fifo = Mongo::Connection.new.db("fifo") 

queue = "#{queue_name}_#{queue_type}" 
unless $fifo[queue].find.present? 
    $fifo.command(create: queue, capped: true, size: 10000000, max: 1000) 
end 
$fifo[queue].insert(url: "http://www.example.com/unique001") 
$fifo[queue].insert(url: "http://www.example.com/unique002") 
$fifo[queue].insert(url: "http://www.example.com/unique003") 

,给了我一个加盖收集,看起来像(从控制台)

> db.test001_high.find() 
{ "_id" : ObjectId("503c4714236f440e9c000001"), "url" : "http://www.example.com/unique001" } 
{ "_id" : ObjectId("503c4714236f440e9c000002"), "url" : "http://www.example.com/unique002" } 
{ "_id" : ObjectId("503c4714236f440e9c000003"), "url" : "http://www.example.com/unique003" } 

我奇怪的是,有没有红宝石的方式在这个集合上有一个阻塞弹出窗口?我必须说我对mongodb不是很熟悉,我只是想创建一个像redis中的fifo队列。所以也许我以错误的方式来解决这个问题。

+0

你看过tailable游标吗? –

回答

2

我在Java中为mongo实现了一个FIFO队列。您应该使用原子操作findAndModify从队列集合中查找最早的条目,并删除文档(remove = true)或设置状态字段。

另一件要小心的事情是,您应该只在MasterOnly读取时执行此操作,或将您的写入编号设置为等于写入时的节点数。否则,由于复制延迟,您可能会得到不一致的结果。