[英]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.