做一个服务器端的一个数据库的负载均衡
其实原理很简单,用的是数据库轮询方式,就不说了,主要问题就是说用的orm库,然后用的orm.express方法,由于orm封装的比较好,所以实现这个最难的地方就是重写orm.express方法,代码如下,别的 不说了。
var orm = require("orm");
var _models = {};
var _db = null;
var _pending = 0;
var _queue = [];
var callNum = 0;
var length = 0;
//uris(数据库的地址集合)
module.exports.express = function (uris, opts) {
opts = opts || {};
length = uris.length;
_pending += 1;
for (var i = 0 ;i<length;i++) {
orm.connect(uris[i], function (err, db) {
if (err) {
if (typeof opts.error === "function") {
opts.error(err);
} else {
throw err;
}
return checkRequestQueue();
}
if (Array.isArray(_db)) {
_db.push(db);
} else if (_db !== null) {
_db = [_db, db];
} else {
_db = [db];
}
return checkRequestQueue();
});
}
return function ORM_ExpressMiddleware(req, res, next) {
callNum++;
var mydb = callNum%length;
if (!req.hasOwnProperty("models")) {
if (typeof opts.define === "function") {
opts.define(_db[mydb], _models);
}
req.models = _models;
req.db = _db[mydb];
}
if (next === undefined && typeof res === 'function')
{
next = res;
}
if (_pending > 0) {
_queue.push(next);
return;
}
return next();
};
};
function checkRequestQueue() {
_pending -= 1;
if (_pending > 0) return;
if (_queue.length === 0) return;
for (var i = 0; i < _queue.length; i++) {
_queue[i]();
}
_queue.length = 0;
}