瞭解和測量HTTP時間有助於咱們發現客戶端到服務器或服務器到服務器之間的通訊性能瓶頸。 本文介紹了HTTP請求中的時間開銷,並展現瞭如何在Node.js中進行測量。node
在咱們開始瞭解HTTP時間開銷以前,讓咱們來看一些基本的概念:git
例如,若是您的DNS查詢所花費的時間比預期的要長,那麼問題多是您的DNS提供商或DNS緩存設置。github
緩慢的內容傳輸多是由效率低下的反應機構引發的,例如發回太多的數據(未使用的JSON屬性等)或緩慢的鏈接。緩存
爲了測量Node.js中的HTTP時間開銷,咱們須要訂閱特定的請求,響應和套接字事件。 這是一個簡短的代碼片斷,展現瞭如何在Node.js中執行此操做,此示例僅關注時序:安全
const timings = { // use process.hrtime() as it's not a subject of clock drift startAt: process.hrtime(), dnsLookupAt: undefined, tcpConnectionAt: undefined, tlsHandshakeAt: undefined, firstByteAt: undefined, endAt: undefined } const req = http.request({ ... }, (res) => { res.once('readable', () => { timings.firstByteAt = process.hrtime() }) res.on('data', (chunk) => { responseBody += chunk }) res.on('end', () => { timings.endAt = process.hrtime() }) }) req.on('socket', (socket) => { socket.on('lookup', () => { timings.dnsLookupAt = process.hrtime() }) socket.on('connect', () => { timings.tcpConnectionAt = process.hrtime() }) socket.on('secureConnect', () => { timings.tlsHandshakeAt = process.hrtime() }) })
DNS查找只會發生在有域名的時候:服務器
/ There is no DNS lookup with IP address const dnsLookup = dnsLookupAt !== undefined ? getDuration(startAt, dnsLookupAt) : undefined
TCP鏈接在主機解析後當即發生:網絡
const tcpConnection = getDuration((dnsLookupAt || startAt), tcpConnectionAt)
TLS握手(SSL)只能使用https協議:socket
// There is no TLS handshake without https const tlsHandshake = tlsHandshakeAt !== undefined ? getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined
咱們等待服務器開始發送第一個字節:tcp
const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)
總持續時間從開始和結束日期計算:分佈式
const total = getDuration(startAt, endAt)
看到整個例子,看看咱們的https://github.com/RisingStac...倉庫。
如今咱們知道如何使用Node測量HTTP時間,咱們來討論可用於瞭解HTTP請求的現有工具。
request
module
著名的request
module具備測量HTTP定時的內置方法。 您可使用time屬性啓用它。
const request = require('request') request({ uri: 'https://risingstack.com', method: 'GET', time: true }, (err, resp) => { console.log(err || resp.timings) })
可使用分佈式跟蹤工具收集HTTP定時,並在時間軸上可視化它們。 這樣,您能夠全面瞭解後臺發生的狀況,以及構建分佈式系統的實際成本是多少。
RisingStack的opentracing-auto庫具備內置的標誌,可經過OpenTracing收集全部HTTP時間。
在Jaeger中使用opentracing-auto的HTTP請求時序。
使用Node.js測量HTTP時間能夠幫助您發現性能瓶頸。 Node生態系統提供了很好的工具來從應用程序中提取這些指標。
關注個人公衆號,更多優質文章定時推送