做一个服务器端的一个数据库的负载均衡
发布于 9 年前 作者 daileimail 4460 次浏览 最后一次编辑是 8 年前 来自 分享

其实原理很简单,用的是数据库轮询方式,就不说了,主要问题就是说用的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;
}
4 回复

格式化一下文档啊

@i5ting 额。。我错了

@daileimail 这次我帮你改了,下次自己来

加点注释吧,没了解过orm库

回到顶部