1000000 のクライアントが flatiron /cradleを使用して、couchdb ドキュメントを同時に更新しようとします 。すべての更新の競合を処理する方法は?
1358 次
2 に答える
0
redis はアトミックであるため、couchdb を redis と一緒に使用することをお勧めします。
于 2014-05-11T20:29:11.460 に答える
0
ここで解決策:
var cradle = require('cradle');
var c = new(cradle.Connection)({cache: true} ) ;
var db = c.database('ml');
function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) {
return;
}
if (index < iterations) {
index++;
func(loop);
} else {
done = true;
callback();
}
},
iteration: function() {
return index - 1;
},
break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}
//----------------------------------------
function revloop(game,gamenumber, callback){
db.get('testdocument', function (err, doc) {
if (err) {
// Handle error
} else {
// Handle success
db.save('testdocument', doc._rev ,{
game:game,
gamenumber:gamenumber
}, function (err, res) {
if (err) {
console.log(err);
if(err.reason=='Document update conflict.')
{callback(0);}
else{console.log('other errror');callback(1)}
} else {
console.log('new game created');
callback(1);
// Handle success
}// success save opengames end bracket
});
}
});
}
//-----------------------------------
asyncLoop(100 ,function(loop){
revloop('b-against-c',3,function(callback){
if(callback == 0){
loop.next();
}
else{loop.break();}
});
} , function(){ console.log('loop finished')});
このソリューションでは、Ivo Wetzelの優れた非同期ループを使用します。
_rev に文字列を追加することによって 9 つの更新の競合が発生したテストは次のとおりです。
var cradle = require('cradle');
var c = new(cradle.Connection)({cache: true} ) ;
var db = c.database('ml');
function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) {
return;
}
if (index < iterations) {
index++;
func(loop);
} else {
done = true;
callback();
}
},
iteration: function() {
return index - 1;
},
break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}
//----------------------------------------
var revchanger= 0;
function revloop(game,gamenumber, callback){
revchanger ++;
var addstuff = revchanger== 10? '':'123';// this will cause nine update conflicts
db.get('testdocument', function (err, doc) {
if (err) {
// Handle error
} else {
// Handle success
db.save('testdocument', doc._rev+addstuff ,{
game:game,
gamenumber:gamenumber
}, function (err, res) {
if (err) {
console.log(err);
if(err.reason=='Document update conflict.')
{callback(0);}
else{console.log('other errror');callback(1)}
} else {
console.log('new game created');
callback(1);
// Handle success
}// success save opengames end bracket
});
}
});
}
//-----------------------------------
asyncLoop(100 ,function(loop){
revloop('a-against-b',2,function(callback){
if(callback == 0){
loop.next();
}
else{loop.break();}
});
} , function(){ console.log('loop finished')});
データベース「ml」を作成します: createml.js:
var cradle = require('cradle');
var c = new(cradle.Connection) ;
var db = c.database('ml');
db.create();
テストドキュメントを作成します: createtestdocument.js:
var cradle = require('cradle');
var db= new(cradle.Connection)().database('ml');
db.save('testdocument' , {
game: 'gamename1',
gamenumber:1
}, function (err, res) {
if (err) {
// Handle error
} else {
// Handle success
}
});
ブラウザで表示するには:
http://localhost:5984/ml/testdocument
于 2014-03-11T12:33:18.640 に答える