3

1000000 のクライアントが flatiron /cradleを使用して、couchdb ドキュメントを同時に更新しようとします 。すべての更新の競合を処理する方法は?

4

2 に答える 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 に答える