Distributed Transactional In-Memory Database (全球首个支持分布式事务的MongoDB)
Make sure Redis and MongoDB has started
sudo npm install -g memdb-server
Copy default config file from node_modules/memdb-server/memdb.conf.js
to ~/.memdb/
(mkdir if not exist), and modify it on your need.
Please read comments carefully.
Use memdbcluster
to control lifecycle of memdb server cluster
memdbcluster [start | stop | status] [--conf=memdb.conf.js] [--shard=shardId]
See the video bellow, note how ACID transaction work cross multiple shards.
Mdbgoose is a modified Mongoose version that work for memdb
var memdb = require('memdb-client');
var P = memdb.Promise;
var mdbgoose = memdb.goose;
// Define player schema
var playerSchema = new mdbgoose.Schema({
_id : String,
name : String,
areaId : Number,
deviceType : Number,
deviceId : String,
items : [mdbgoose.SchemaTypes.Mixed],
}, {collection : 'player'});
// Define player model
var Player = mdbgoose.model('player', playerSchema);
var main = P.coroutine(function*(){
// Connect to memdb
yield mdbgoose.connectAsync({
shards : { // specify all shards here
s1 : {host : '127.0.0.1', port: 31017},
s2 : {host : '127.0.0.1', port: 31018},
}
});
// Make a transaction in s1
yield mdbgoose.transactionAsync(P.coroutine(function*(){
var player = new Player({
_id : 'p1',
name: 'rain',
areaId : 1,
deviceType : 1,
deviceId : 'id1',
items : [],
});
// insert a player
yield player.saveAsync();
// find player by id
var doc = yield Player.findByIdAsync('p1');
console.log('%j', doc);
// find player by areaId, return array of players
var docs = yield Player.findAsync({areaId : 1});
console.log('%j', docs);
// find player by deviceType and deviceId
player = yield Player.findOneAsync({deviceType : 1, deviceId : 'id1'});
// update player
player.areaId = 2;
yield player.saveAsync();
// remove the player
yield player.removeAsync();
}), 's1');
});
if (require.main === module) {
main().finally(process.exit);
}
To run the sample above:
collections : {
player : {
indexes : [
{
keys : ['areaId'],
},
{
keys : ['deviceType', 'deviceId'],
unique : true,
},
]
}
}
memdbcluster stop
memdbcluster start
npm install memdb-client
node --harmony sample.js
Check here to see how to port your Mongoose project to Mdbgoose
MemDB is like a 'cache layer' built up on MongoDB which support distributed ACID transaction.
MemDB has its own API which similar to MongoDB, however, you can still use MongoDB's native query API by directly access backend storage, here are the guidelines:
Here are some basic rules for memdb:
Quick Pomelo is a Scalable, Transactional and Reliable Game Server Framework based on Pomelo and MemDB
Copyright 2015 rain1017.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See the AUTHORS file for names of contributors.