nodejs-https请求花费的时间太长 [英] nodejs - https requests taking too long

查看:666
本文介绍了nodejs-https请求花费的时间太长的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,每0.5秒,我就有兴趣尽快获得比特币的价格.

So every 0.5 seconds, I'm interested in getting the price of Bitcoin as fast as possible.

curl https://www.okcoin.com/api/ticker.do?ok=1

***首先,我在nodejs中这样做:

*** 1st I do this in nodejs:

var https = require('https');

var options = {
    host: 'www.okcoin.com',
    port: 443,
    path: '/api/ticker.do?ok=1',
    method: 'GET'
};

var time;
time=process.hrtime();
var req = https.request(options, function (res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        var diff=process.hrtime(time);
    console.log("took %dms", (diff[0] * 1e9 + diff[1])/1e6);

    var obj=JSON.parse(chunk);
    console.log("buy: "+obj.ticker.buy);
    console.log("sell: "+obj.ticker.sell);
    });
});
req.end();

我得到:

took 1033.241079ms
buy: 356.83
sell: 357.02

1033ms对我来说太慢了...

1033ms is way too slow for me...

***第二,我愿意(每2秒检查一次新价格):

*** 2ndly, I do (check for new price every 2 seconds):

var https = require('https');

var options = {
    host: 'www.okcoin.com',
    port: 443,
    path: '/api/ticker.do?ok=1',
    method: 'GET'
};


var time;
setInterval(function (){
    time=process.hrtime();
    https.get(options,function(res) {
        res.on('data', function (body) {
            var diff=process.hrtime(time);
            console.log("took %dms", (diff[0] * 1e9 + diff[1])/1e6);
        });
    })
},2000);

赠予:

took 983.929691ms
took 944.539056ms
took 650.801495ms
took 729.976666ms
took 474.631864ms
took 1577.007647ms
took 1263.056615ms
took 929.032185ms
took 248.543903ms
took 702.258904ms
took 250.711814ms
took 832.824128ms
took 252.986642ms
took 255.080667ms
took 301.444557ms
took 297.921488ms

对我来说还是很慢...

Still looks slow to me...

***第三,我使用agentkeepalive模块(再次每2秒轮询一次):

*** 3rdly, I use agentkeepalive module (again polling every 2 seconds):

var https = require('https');
var kaa = require('agentkeepalive').HttpsAgent;

var keepaliveAgent = new kaa({
    maxSockets: 100,
    maxFreeSockets: 10,
    timeout: 60000,
    keepAliveTimeout: 30000   //free socket keepalive for 30 seconds
});
var options = {
    host: 'www.okcoin.com',
    port: 443,
    path: '/api/ticker.do?ok=1',
    method: 'GET',
    agent: keepaliveAgent
};


var time;
setInterval(function (){
    time=process.hrtime();
    https.get(options,function(res) {
    res.on('data', function (body) {
        var diff=process.hrtime(time);
        console.log("took %dms", (diff[0] * 1e9 + diff[1])/1e6);
    });
    })
},2000);

赠予:

took 1673.525828ms
took 286.205758ms
took 276.441161ms
took 276.11333ms
took 770.785999ms
took 470.329748ms
took 235.586808ms
took 284.85831ms
took 238.250933ms
took 239.285309ms
took 237.260822ms
took 460.541798ms
took 853.24585ms
took 234.314756ms
took 285.784553ms
took 286.228781ms
took 235.298578ms
took 569.50514ms
took 235.890092ms
took 241.18033ms
took 234.773913ms

这是我能做的最好的吗?我正在英国的VPS上运行所有这些程序.除了将我的VPS移到香港附近以减少延迟之外;我还有什么可以做的吗?我怎么知道keepalive在起作用?我可以绕过任何SSL或网络握手吗?

Is this the best I can do? I'm running all this from a VPS in the UK. Apart from moving my VPS closer to Hong Kong to get lower latency; is there anything else I can do? How do I know that the keepalive is working? Can I bypass any of the SSL or network handshaking?

推荐答案

使用请求包,我似乎得到了稍微好一点的结果,但是总体上与您的step3类似,也许可以尝试一下,我正在美国运行它:

I seem to get very slightly better results using the request package, but overall similar to your step3 maybe try that one, I'm running it from US :

代码:

var request = require('request');
var options = {
    url:'https://www.okcoin.com/api/ticker.do?ok=1',
    headers: {
            'connection': 'Keep-Alive'
        }
}

setInterval(function(){
var time;
time=Date.now();
request(options,function(err,res,body){
    var diff=Date.now();
    console.log("took %dms", (diff-time));
});
},1000);

输出:

took 484ms
took 253ms
took 248ms
took 254ms
took 251ms
took 259ms
took 255ms
took 252ms
took 259ms
took 257ms
took 263ms
took 255ms
took 257ms
took 253ms
took 264ms
took 254ms

现在考虑这个思想实验:

Now consider this thought experiment :

伦敦和香港之间有9623公里.

There's 9623km between London and HK.

光速直线,您的数据包来回传输需要2 *(9623/300000)= 64ms.

At the speed of light, and in a straight line, your packet would take 2*(9623/300000) = 64ms to travel back and forth.

现在,它不是一条直的光纤,它必须经过的多个服务器...以及服务器处理您的请求所花费的时间.

Now add to that the fact that it's not a straight optic fiber, the multiple servers it has to pass through... and the time the server takes to process your request.

我想250ms毕竟还不错;)

I guess 250ms isn't that bad after all ;)

这篇关于nodejs-https请求花费的时间太长的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆