您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)如何利用Node.js了解與測量HTTP所花費的時間的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在我們開始了解HTTP時間開銷之前,讓我們來看一些基本的概念:
IP(互聯(lián)網(wǎng)協(xié)議):IP是網(wǎng)絡(luò)層協(xié)議,涉及網(wǎng)絡(luò)尋址和路由。 IP負責(zé)根據(jù)一個或多個IP網(wǎng)絡(luò)上的數(shù)據(jù)包頭將數(shù)據(jù)包從源主機傳送到目標主機。 它還定義了封裝要傳遞的數(shù)據(jù)的數(shù)據(jù)包結(jié)構(gòu)。
DNS(域名服務(wù)器):DNS是一種分層分散式命名系統(tǒng),用于將諸如risingstack.com的人類可讀主機名解析為機器可讀的IP地址。
TCP(傳輸控制協(xié)議):TCP標準定義了如何在應(yīng)用程序之間建立和維護網(wǎng)絡(luò)對話以交換數(shù)據(jù)。 TCP在通過IP網(wǎng)絡(luò)通信的主機上運行的應(yīng)用程序之間提供可靠,有序和錯誤檢查的八位字節(jié)流。 HTTP客戶端通過建立TCP連接來發(fā)起請求。
SSL / TLS(傳輸層安全性):TLS是一種通過計算機網(wǎng)絡(luò)提供通信安全性的加密協(xié)議。 SSL(安全套接字層)是TLS的不推薦使用的前身。 TLS和SSL都使用證書建立安全連接。 SSL證書不依賴于加密協(xié)議(如TLS),證書包含密鑰對:公鑰和私鑰。 這些密鑰一起工作,建立一個加密的連接。
現(xiàn)在我們來看一下通常HTTP請求的時間表:
DNS查找:執(zhí)行DNS查找所花費的時間。 DNS查找將域名解析為IP地址。 每個新的域需要一個完整的往返行程來進行DNS查找。 當目的地已經(jīng)是IP地址時,沒有DNS查找。
TCP連接:在源主機和目標主機之間建立TCP連接所需的時間。 必須在多步握手過程中正確建立連接。 TCP連接由操作系統(tǒng)管理,如果基礎(chǔ)TCP連接無法建立,則OS范圍的TCP連接超時將會進入我們應(yīng)用程序中的超時配置。
TLS握手:完成TLS握手的時間。 在握手過程中,端點交換認證和密鑰以建立或恢復(fù)安全會話。 沒有HTTPS請求的不需要TLS握手。
第一個字節(jié)的時間(TTFB):等待初始響應(yīng)的時間。 此時間除了等待服務(wù)器處理請求和傳遞響應(yīng)所花費的時間之外,還可以捕獲往返服務(wù)器的延遲。
內(nèi)容傳輸:接收響應(yīng)數(shù)據(jù)所花費的時間。 響應(yīng)數(shù)據(jù)的大小和可用的網(wǎng)絡(luò)帶寬決定其持續(xù)時間。
如何通過HTTP時間開銷幫助發(fā)現(xiàn)性能瓶頸?
例如,如果您的DNS查詢所花費的時間比預(yù)期的要長,那么問題可能是您的DNS提供商或DNS緩存設(shè)置。
緩慢的內(nèi)容傳輸可能是由效率低下的反應(yīng)機構(gòu)引起的,例如發(fā)回太多的數(shù)據(jù)(未使用的JSON屬性等)或緩慢的連接。
測量Node.js中的HTTP時間開銷
為了測量Node.js中的HTTP時間開銷,我們需要訂閱特定的請求,響應(yīng)和套接字事件。 這是一個簡短的代碼片段,展示了如何在Node.js中執(zhí)行此操作,此示例僅關(guān)注時序:
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查找只會發(fā)生在有域名的時候:
/ There is no DNS lookup with IP address const dnsLookup = dnsLookupAt !== undefined ? getDuration(startAt, dnsLookupAt) : undefined
TCP連接在主機解析后立即發(fā)生:
const tcpConnection = getDuration((dnsLookupAt || startAt), tcpConnectionAt)
TLS握手(SSL)只能使用https協(xié)議:
// There is no TLS handshake without https const tlsHandshake = tlsHandshakeAt !== undefined ? getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined
我們等待服務(wù)器開始發(fā)送第一個字節(jié):
const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)
總持續(xù)時間從開始和結(jié)束日期計算:
const total = getDuration(startAt, endAt)
看到整個例子,看看我們的https://github.com/RisingStac...倉庫。
測量時間的工具
現(xiàn)在我們知道如何使用Node測量HTTP時間,我們來討論可用于了解HTTP請求的現(xiàn)有工具。
request module
著名的request module具有測量HTTP定時的內(nèi)置方法。 您可以使用time屬性啟用它。
const request = require('request') request({ uri: 'https://risingstack.com', method: 'GET', time: true }, (err, resp) => { console.log(err || resp.timings) })
分布式跟蹤
可以使用分布式跟蹤工具收集HTTP定時,并在時間軸上可視化它們。 這樣,您可以全面了解后臺發(fā)生的情況,以及構(gòu)建分布式系統(tǒng)的實際成本是多少。
RisingStack的opentracing-auto庫具有內(nèi)置的標志,可通過OpenTracing收集所有HTTP時間。
在Jaeger中使用opentracing-auto的HTTP請求時序。
感謝各位的閱讀!關(guān)于“如何利用Node.js了解與測量HTTP所花費的時間”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。