[英]Concurrency in MongoDB
我將收集requests
用作多個客戶端同時讀取的隊列。 每個客戶一次從requests
讀取一個文檔,然后將其從集合中刪除。 我可以確保每個文檔只能由1個客戶端讀取和處理嗎?
客戶端是用pymongo用Python編寫的。
這里的基本過程是使用.findAndModify()
:
原諒這不是python代碼,但結構相同,是一個合理的通用示例。 三個文件:
{ "_id": 1 }
{ "_id": 2 }
{ "_id": 3 }
因此,從核心方法中,您只需在每個_id
上使用“ remove”參數來調用它。 沒有其他進程可以同時執行此操作。
db.collection.findAndModify({
"query": { "_id": 1 },
"remove": true
})
那要么返回被刪除的文檔,要么什么都不返回。
為了獲得更多的“並發性”證明,請再次在這里原諒node.js代碼,但是我不打算做一些簡單的“ Twisted”類型代碼作為快速示例。 但是,它可以達到並發測試的目的:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
var testSchema = new Schema({
"_id": Number,
});
var Test = mongoose.model( 'Test', testSchema, 'test' );
mongoose.connect('mongodb://localhost/async');
async.series(
[
// Clear test collection
function(callback) {
Test.remove({},callback)
},
// Insert some data
function(callback) {
async.each([1,2,3],function(num,callback) {
Test.create({ "_id": num },callback);
},callback);
},
// Now run test in parallel
function(callback) {
async.each([1,1,2,2,3,3],function(num,callback) {
Test.findOneAndRemove(
{ "_id": num },
function(err,doc) {
if (err) callback(err);
console.log( "Removing: %s, %s", num, doc );
callback();
}
);
},callback);
}
],
function(err) {
process.exit();
}
);
結果(可能有變化的順序):
Removing: 3, { _id: 3, __v: 0 }
Removing: 1, { _id: 1, __v: 0 }
Removing: 3, null
Removing: 1, null
Removing: 2, { _id: 2, __v: 0 }
Removing: 2, null
因此,在這里進行的六次嘗試中,每個文檔兩次嘗試,實際上只有3次嘗試成功,並返回了從堆棧中拉出的結果。
這是確保獲得所需結果的原則。
看起來像您要找的
db.requests.findAndModify()
根據文檔,如果將它與主字段上的唯一索引一起使用,則應該放在一個合適的位置。
http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.