1

mongodb と ruby​​(mongoid) で FIFO キューを作成することは可能でしょうか。

上限付きコレクションを使用しようとしていますが、キューをポップする方法がわかりません。これを行うためのメソッドがコレクションにないようです。

私が今していることは次のとおりです。

$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" }

私が疑問に思っているのは、Ruby でこのコレクションにブロッキング ポップを表示する方法はあるのでしょうか? 私は mongodb にあまり詳しくなく、redis のように fifo キューを作成しようとしているだけだと言わざるを得ません。したがって、おそらく私はこの問題に間違った方法で取り組んでいます。

4

1 に答える 1

2

Java で mongo の FIFO キューを実装しました。アトミック操作findAndModifyを使用して、キュー コレクションから最も古いエントリを検索し、ドキュメントを削除する (remove=true) か、ステータス フィールドを設定する必要があります。

注意すべきもう 1 つのことは、MasterOnly 読み取りでのみこれを行うか、書き込み時のノード数と等しい書き込み番号を設定することです。そうしないと、レプリケーションの遅延により、一貫性のない結果が得られる可能性があります。

于 2012-08-28T15:44:13.393 に答える