2013-12-15 86 views
1

我想使用節點HTTP代理來創建一個「最少連接」代理。換句話說,它選擇一個當前連接最少的後端。代理有一個「結束」事件,但它不會傳遞給你任何信息,所以我不知道如何用當前的併發請求數來增加/減少我的每個後端的計數器。節點HTTP代理最少連接代理

+1

相當肯定沒有什麼在那裏,可以做到這一點 - 你可能就會有自己的WebSockets使用來構建它。或者,你看過[衛星](https://npmjs.org/package/satellite)嗎? – brandonscript

+0

感謝指向衛星的指針。最後,我還要有這個管理本地主機上的進程(可能是java,節點等),並有周圍循環利用它們,等等一些其他的功能...這樣的衛星碼會很好看在。 – Dave

回答

2

我想你可以等待響應已被髮送到客戶端。

例如:

var backends = [ 
    { host : 'backend1', port: 80, active : 0 }, 
    { host : 'backend2', port: 80, active : 0 }, 
    { host : 'backend3', port: 80, active : 0 }, 
    { host : 'backend4', port: 80, active : 0 }, 
]; 

httpProxy.createServer(function (req, res, proxy) { 
    var buffer = httpProxy.buffer(req); 

    // Pick the backend with the least active requests (naive implementation). 
    var backend = backends.sort(function(a, b) { 
    return a.active - b.active; 
    })[0]; 

    // Add a new active request. 
    backend.active++; 

    // Proxy the request. 
    proxy.proxyRequest(req, res, { 
    host : backend.host, 
    port : backend.port, 
    buffer : buffer 
    }); 

    // When the response is finished, decrease the count. 
    res.on('finish', function() { 
    backend.active--; 
    }); 
}).listen(8000); 
+0

謝謝!我可能會在proxy.proxyRequest()之前設置res.on('finish'),以防止在設置回調之前res完成。 – Dave

+0

@戴夫這不是絕對必要的([這個答案](http://stackoverflow.com/a/11614706/893780)解釋了爲什麼):) – robertklep

+0

謝謝,現在讓很多我更有意義! – Dave