javascript - 这是一个好的服务器负载平衡系统吗?

标签 javascript node.js performance cluster-computing server

我对这个概念很陌生,我正在考虑如何水平扩展我的 Xepler Node.js 框架。

因此,主服务器上的主应用程序会将请求代理到队列中的第一个集群(可能使用 Redis 的共享内存进行检索)。每 X 个请求(取决于服务器能力,X 由我决定,可能使用映射),集群将被移动到这个队列的最后一个位置。这样,所有集群只会收到较少数量的请求。

另一个应用程序,在另一台服务器上,每X秒就会向所有集群发出一个请求,以检查是否有人失败,并将其从队列中删除(这个队列将在redis上?)

所有集群通常都会运行我的 Web 框架的一个实例。

对你来说这是一个很好的负载平衡系统,还是我完全误解了它的工作原理?谢谢大家

编辑:这就是我的意思(只是一个例子):

var http = require('http'),
     https = require('https'),
    httpProxy = require('http-proxy'),
    proxy = httpProxy.createProxyServer({}),

     clusters = [
        {
            id: 1,
            host: "localhost",
            port: 8080,
            dead : false,
            deadTime : undefined
        },      
        {
            id: 2,
            host: "localhost",
            port: 8081,
            dead : false,
            deadTime : undefined
        }
     ];

http.createServer(function(req, res) {
    var target = getAvailableCluster();

    if (target != -1) {
        proxy.web(req, res, { target: 'http://' + target.host + ':' + target.port });

        res.setTimeout(1e3 * 20, function() {
            target.dead = true;
            target.deadTime = new Date().getTime();
            console.log("Cluster " + target.id + " is dead");
        });
    }   
}).listen(80, function() {
    console.log('Proxy listening on port 80..');
});

proxy.on('error', function (error, req, res) {
    var json;
    console.log('proxy error', error);

    if (!res.headersSent)
        res.writeHead(500, { 'content-type': 'application/json' });

    json = { error: 'proxy_error', reason: error.message };
    res.end(JSON.stringify(json));
});

setInterval(function() {
    var cluster,
        currentTime = new Date().getTime();

    for (var i=0; i<clusters.length; i++) {
        cluster = clusters[i];

        if (cluster.dead && (currentTime - cluster.deadTime) > 1000) {
            cluster.dead = false;
            console.log("Cluster " + cluster.id + " is now alive");
        }
    }   
}, 5000);

function getAvailableCluster() {
    var cluster;

    for (var i=0; i<clusters.length; i++) {
        cluster = clusters.shift();
        clusters.push(cluster);

        if (!cluster.dead)      
            return cluster;
    }

    return -1;
}

最佳答案

为什么要重新发明轮子?有hipache据我所知,反向代理/负载均衡器具有您需要的所有功能。

关于javascript - 这是一个好的服务器负载平衡系统吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117578/

相关文章:

node.js - 异步队列永远不会随机触发耗尽

javascript - 是否可以使用nodejs/npm启动具有不同权限的js文件?

C++ AMP 很慢

javascript - Jquery检测具有相同ID的多个输入中的按键

javascript - 递归地展平深度嵌套的对象和数组的组合

javascript - 实时验证字母并对其进行操作

eclipse - Java在win7上很慢

javascript - 随机.HTML,如何让它停止

node.js - 创建自定义类型文件

javascript - 动态推送基于每一行输入的数组