나는 복수 클라이언트가 동시에 읽는 큐로 requests
콜렉션을 사용하고 있습니다. 각 클라이언트는 한 번에 하나의 문서를 requests
에서 읽고 컬렉션에서 제거합니다. 1 명의 고객 만 각 문서를 읽고 처리 할 수 있습니까?MongoDB의 동시성
클라이언트는 Python으로 pymongo로 작성됩니다.
나는 복수 클라이언트가 동시에 읽는 큐로 requests
콜렉션을 사용하고 있습니다. 각 클라이언트는 한 번에 하나의 문서를 requests
에서 읽고 컬렉션에서 제거합니다. 1 명의 고객 만 각 문서를 읽고 처리 할 수 있습니까?MongoDB의 동시성
클라이언트는 Python으로 pymongo로 작성됩니다.
여기에 기본 절차는 .findAndModify()
사용하는 것입니다
이 파이썬 코드가 아닙니다 것을 용서하지만, 구조는 동일하고 합리적인 보편적 인 예입니다. 세 가지 문서 :
{ "_id": 1 }
{ "_id": 2 }
{ "_id": 3 }
그래서 핵심 방법에서, 당신은 단지 각
_id
에서 "제거"인수를 호출합니다. 다른 프로세스가 동시에이 작업을 수행 할 수는 없습니다.
db.collection.findAndModify({
"query": { "_id": 1 },
"remove": true
})
삭제 된 문서를 반환하거나 전혀 반환하지 않습니다. 좀 더 "동시성"증거를 들어
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
: (가능한 다양한 순서)
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();
}
);
그리고 결과 : 그것은 비록 동시성 테스트의 목적을 제공 시도는 실제로 성공하고 결과를 스택에서 제거합니다.
원하는 결과를 얻는 것이 원칙입니다. 이 문서에 따르면
db.requests.findAndModify()
을 찾고있는 것처럼
이것은 훌륭한 대답이었습니다. 감사합니다. 파이썬으로 아주 쉽게 적용 할 수 있습니다. – rgrasell
는이 메인 필드에서 고유 인덱스로 사용하는 경우가 좋은 곳에서 생을 마감해야 같은데.
http://docs.mongodb.org/manual/reference/method/db.collection.findAndModify/
낙관적 잠금은 현재 DBA 중심의 접근 방식을 될 수 @Sammaye 유일한 진짜 방법 – Sammaye
이지만, 다행히 MongoDB를 염두에 프로그래머로 구축하고이를 수용 할 수 있었다. –
@NeilLunn 그는 큐에서 읽는 중이기 때문에 자신의 문제를 단순화했다는 느낌이 들었다. – Sammaye