3

次のように、node-http-proxy によって行われる各プロキシ要求の応答時間を計算したいと思います。

var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer();

require('http').createServer(function(req, res) {
   // start-time for one request
   proxy.web(req, res, { target: 'localhost:80' });
}).listen(3000);

proxy.on('proxyRes', function (res) {
  // end-time for one request to calculate the time
  console.log('RAW Response from the target', JSON.stringify(res.headers, true, 2));
});

だから私は開始時間と終了時間の間の時差を取得したい。イベントをキャッチすることはできますがproxyRes、プロキシ応答を適切なクライアント要求に一致させるにはどうすればよいですか?

更新:私は次のことを試しました:

var httpProxy = require('http-proxy');
var http = require('http');

var proxy = new httpProxy.createProxyServer({
    target: {
        host: 'localhost',
        port: 80
    }
});

var start_time = 0;
var proxyServer = http.createServer(function (req, res) {


    start_time = new Date().getTime();

    proxy.web(req, res);

    res.on('finish', function() {
        console.log("The request was proxied in " + (new Date().getTime() - start_time) + "ms");
    });
});

proxyServer.listen(3000);

// Proxy-Target server
var n = 0; sleep = 0;
http.createServer(function (req, res) {

    n++;

    var start_time = new Date().getTime();

    res.writeHead(200, {'Content-Type': 'text/plain'});

    if (n % 2 == 0){
        sleep = 2000;
    } else {
        sleep = 5000;
    }

    setTimeout(function(){
        res.end("...");
    }, sleep);

    res.on('finish', function(d) {
        var diff_time = new Date().getTime() - start_time;
        console.log("The request was processed in " + (new Date().getTime() - start_time) + "ms");
    });

}).listen(80);

そのため、ターゲット サーバーの時間は正しく測定されます。これは、1 つの要求が 2 秒または 5 秒続く可能性があるためです。ただし、プロキシは、わずか数ミリ秒の応答時間を測定する場合があります。次のような apache-bench を使用して試してみましab -n 10 -c 3 http://localhost:3000/た。コンソールの結果は次のとおりです。

The request was processed in 2007ms
The request was proxied in 2017ms
The request was processed in 2003ms
The request was proxied in 2006ms
The request was processed in 5002ms
The request was processed in 5001ms
The request was proxied in 980ms
The request was proxied in 981ms
The request was processed in 2002ms
The request was proxied in 2006ms
The request was processed in 2002ms
The request was proxied in 2005ms
The request was processed in 5000ms
The request was proxied in 8ms
The request was processed in 5000ms
The request was proxied in 982ms
The request was processed in 2001ms
The request was proxied in 2005ms
The request was processed in 5002ms
The request was proxied in 4998ms
4

2 に答える 2

4

今では動作し、nodejs google-gloup で重要なヒントを取得しました。対処はstart_timeローカルに設定されていませんでした。動作するコードは次のとおりです。

var httpProxy = require('http-proxy');
var http = require('http');

var proxy = new httpProxy.createProxyServer({});

// before: var start_time = 0;
var proxyServer = http.createServer(function (req, res) {

    // now
    var start_time = new Date().getTime();

    proxy.web(req, res, { target: 'http://localhost:80' });

    res.on('finish', function() {
       console.log("The request was proxied in " + (new Date().getTime() - start_time) + "ms");
    });
});
proxyServer.listen(3000);
于 2014-01-25T19:42:14.050 に答える