2014-10-10 6 views
0

Итак, каждые 0,5 секунды, я заинтересован в том, чтобы как можно быстрее получить цену биткойна.nodejs - слишком долго https-запросы

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

*** первым я делаю это в 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 является слишком медленным для меня ...

*** Во-вторых, я (проверяю новую цену каждые 2 секунды):

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 

Тем не менее выглядит медленно мне ...

*** 3rdly, я использую agentkeepalive модуль (опять же опрос каждые 2 секунды):

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 или сети?

+0

Вы можете проверить, если KeepAlive работает вынюхиванию запросов и ответов с помощью Wireshark, например. – tiledcode

+0

Wireshark кажется излишним; ( – Eamorr

ответ

1

я, кажется, получают очень немного лучше результатов, используя пакет запроса, но в целом похоже на ваш шаг 3, может быть, попробовать, что один, я бегу его из США:

Код:

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 

Теперь рассмотрим этот мысленный эксперимент:

Между Лондоном и ХК находится 9623 км.

В скорости света и по прямой, ваш пакет будет принимать 2 * (9623/300000) = 64ms для поездки туда и обратно.

Теперь добавьте к этому тот факт, что это не прямой оптический кабель, несколько серверов, с которыми он должен пройти ... и время, которое сервер берет на обработку вашего запроса.

Я думаю 250мс не так уж плохо;)