国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用Node.js了解和測(cè)量HTTP花費(fèi)的時(shí)間

wujl596 / 2820人閱讀

摘要:握手完成握手的時(shí)間。此時(shí)間除了等待服務(wù)器處理請(qǐng)求和傳遞響應(yīng)所花費(fèi)的時(shí)間之外,還可以捕獲往返服務(wù)器的延遲。內(nèi)容傳輸接收響應(yīng)數(shù)據(jù)所花費(fèi)的時(shí)間。響應(yīng)數(shù)據(jù)的大小和可用的網(wǎng)絡(luò)帶寬決定其持續(xù)時(shí)間。總結(jié)使用測(cè)量時(shí)間可以幫助您發(fā)現(xiàn)性能瓶頸。

了解和測(cè)量HTTP時(shí)間有助于我們發(fā)現(xiàn)客戶端到服務(wù)器服務(wù)器到服務(wù)器之間的通信性能瓶頸。 本文介紹了HTTP請(qǐng)求中的時(shí)間開銷,并展示了如何在Node.js中進(jìn)行測(cè)量。

在我們開始了解HTTP時(shí)間開銷之前,讓我們來(lái)看一些基本的概念:

IP(互聯(lián)網(wǎng)協(xié)議):IP是網(wǎng)絡(luò)層協(xié)議,涉及網(wǎng)絡(luò)尋址和路由。 IP負(fù)責(zé)根據(jù)一個(gè)或多個(gè)IP網(wǎng)絡(luò)上的數(shù)據(jù)包頭將數(shù)據(jù)包從源主機(jī)傳送到目標(biāo)主機(jī)。 它還定義了封裝要傳遞的數(shù)據(jù)的數(shù)據(jù)包結(jié)構(gòu)。

DNS(域名服務(wù)器):DNS是一種分層分散式命名系統(tǒng),用于將諸如risingstack.com的人類可讀主機(jī)名解析為機(jī)器可讀的IP地址。

TCP(傳輸控制協(xié)議):TCP標(biāo)準(zhǔn)定義了如何在應(yīng)用程序之間建立和維護(hù)網(wǎng)絡(luò)對(duì)話以交換數(shù)據(jù)。 TCP在通過(guò)IP網(wǎng)絡(luò)通信的主機(jī)上運(yùn)行的應(yīng)用程序之間提供可靠,有序和錯(cuò)誤檢查的八位字節(jié)流。 HTTP客戶端通過(guò)建立TCP連接來(lái)發(fā)起請(qǐng)求。

SSL / TLS(傳輸層安全性):TLS是一種通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)提供通信安全性的加密協(xié)議。 SSL(安全套接字層)是TLS的不推薦使用的前身。 TLS和SSL都使用證書建立安全連接。 SSL證書不依賴于加密協(xié)議(如TLS),證書包含密鑰對(duì):公鑰和私鑰。 這些密鑰一起工作,建立一個(gè)加密的連接。

現(xiàn)在我們來(lái)看一下通常HTTP請(qǐng)求的時(shí)間表:

DNS查找:執(zhí)行DNS查找所花費(fèi)的時(shí)間。 DNS查找將域名解析為IP地址。 每個(gè)新的域需要一個(gè)完整的往返行程來(lái)進(jìn)行DNS查找。 當(dāng)目的地已經(jīng)是IP地址時(shí),沒(méi)有DNS查找。

TCP連接:在源主機(jī)和目標(biāo)主機(jī)之間建立TCP連接所需的時(shí)間。 必須在多步握手過(guò)程中正確建立連接。 TCP連接由操作系統(tǒng)管理,如果基礎(chǔ)TCP連接無(wú)法建立,則OS范圍的TCP連接超時(shí)將會(huì)進(jìn)入我們應(yīng)用程序中的超時(shí)配置。

TLS握手:完成TLS握手的時(shí)間。 在握手過(guò)程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 沒(méi)有HTTPS請(qǐng)求的不需要TLS握手。

第一個(gè)字節(jié)的時(shí)間(TTFB):等待初始響應(yīng)的時(shí)間。 此時(shí)間除了等待服務(wù)器處理請(qǐng)求和傳遞響應(yīng)所花費(fèi)的時(shí)間之外,還可以捕獲往返服務(wù)器的延遲。

內(nèi)容傳輸:接收響應(yīng)數(shù)據(jù)所花費(fèi)的時(shí)間。 響應(yīng)數(shù)據(jù)的大小和可用的網(wǎng)絡(luò)帶寬決定其持續(xù)時(shí)間。

如何通過(guò)HTTP時(shí)間開銷幫助發(fā)現(xiàn)性能瓶頸?

例如,如果您的DNS查詢所花費(fèi)的時(shí)間比預(yù)期的要長(zhǎng),那么問(wèn)題可能是您的DNS提供商或DNS緩存設(shè)置。

緩慢的內(nèi)容傳輸可能是由效率低下的反應(yīng)機(jī)構(gòu)引起的,例如發(fā)回太多的數(shù)據(jù)(未使用的JSON屬性等)或緩慢的連接。

測(cè)量Node.js中的HTTP時(shí)間開銷

為了測(cè)量Node.js中的HTTP時(shí)間開銷,我們需要訂閱特定的請(qǐng)求,響應(yīng)和套接字事件。 這是一個(gè)簡(jiǎn)短的代碼片段,展示了如何在Node.js中執(zhí)行此操作,此示例僅關(guān)注時(shí)序:

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查找只會(huì)發(fā)生在有域名的時(shí)候:

/ There is no DNS lookup with IP address
const dnsLookup = dnsLookupAt !== undefined ?  
  getDuration(startAt, dnsLookupAt) : undefined

TCP連接在主機(jī)解析后立即發(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ā)送第一個(gè)字節(jié)

const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)  

總持續(xù)時(shí)間從開始和結(jié)束日期計(jì)算:

const total = getDuration(startAt, endAt)  

看到整個(gè)例子,看看我們的https://github.com/RisingStac...倉(cāng)庫(kù)。

測(cè)量時(shí)間的工具

現(xiàn)在我們知道如何使用Node測(cè)量HTTP時(shí)間,我們來(lái)討論可用于了解HTTP請(qǐng)求的現(xiàn)有工具。

request module

著名的request module具有測(cè)量HTTP定時(shí)的內(nèi)置方法。 您可以使用time屬性啟用它。

const request = require("request")

request({  
  uri: "https://risingstack.com",
  method: "GET",
  time: true
}, (err, resp) => {
  console.log(err || resp.timings)
})
分布式跟蹤

可以使用分布式跟蹤工具收集HTTP定時(shí),并在時(shí)間軸上可視化它們。 這樣,您可以全面了解后臺(tái)發(fā)生的情況,以及構(gòu)建分布式系統(tǒng)的實(shí)際成本是多少。

RisingStack的opentracing-auto庫(kù)具有內(nèi)置的標(biāo)志,可通過(guò)OpenTracing收集所有HTTP時(shí)間。

在Jaeger中使用opentracing-auto的HTTP請(qǐng)求時(shí)序。

總結(jié)

使用Node.js測(cè)量HTTP時(shí)間可以幫助您發(fā)現(xiàn)性能瓶頸。 Node生態(tài)系統(tǒng)提供了很好的工具來(lái)從應(yīng)用程序中提取這些指標(biāo)。

關(guān)注我的公眾號(hào),更多優(yōu)質(zhì)文章定時(shí)推送

翻譯自Understanding & Measuring HTTP Timings with Node.js

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88595.html

相關(guān)文章

  • 前端排序算法總結(jié);前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒(méi)。在握手過(guò)程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...

    aaron 評(píng)論0 收藏0
  • 前端排序算法總結(jié);前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒(méi)。在握手過(guò)程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...

    ARGUS 評(píng)論0 收藏0
  • 前端排序算法總結(jié);前端面試題2.0;JavaScript異步編程

    摘要:與異步編程按照維基百科上的解釋獨(dú)立于主控制流之外發(fā)生的事件就叫做異步。因?yàn)榈拇嬖冢辽僭诒粯?biāo)準(zhǔn)化的那一刻起,就支持異步編程了。然而異步編程真正發(fā)展壯大,的流行功不可沒(méi)。在握手過(guò)程中,端點(diǎn)交換認(rèn)證和密鑰以建立或恢復(fù)安全會(huì)話。 1、前端 排序算法總結(jié) 排序算法可能是你學(xué)編程第一個(gè)學(xué)習(xí)的算法,還記得冒泡嗎? 當(dāng)然,排序和查找兩類算法是面試的熱門選項(xiàng)。如果你是一個(gè)會(huì)寫快排的程序猿,面試官在比較...

    April 評(píng)論0 收藏0
  • [譯]保持Node.js速度-創(chuàng)建高性能Node.js Servers工具、技術(shù)提示

    摘要:本文翻譯自原文地址中文標(biāo)題保持的速度創(chuàng)建高性能的工具技術(shù)和提示快速摘要是一個(gè)非常多彩的平臺(tái),而創(chuàng)建服務(wù)就是其非常重要的能力之一。在目錄下,我們執(zhí)行譯者注現(xiàn)在的話可以使用新的形式的命令語(yǔ)法會(huì)在剖析完畢后,創(chuàng)建文件并自動(dòng)打開瀏覽器。 pre-tips 本文翻譯自: Keeping Node.js Fast: Tools, Techniques, And Tips For Making Hi...

    Lavender 評(píng)論0 收藏0
  • 15個(gè)有趣JavaScript與CSS庫(kù)

    摘要:而調(diào)試器具有對(duì)模型控制器以及視圖的實(shí)時(shí)管理權(quán)限。項(xiàng)目地址是一個(gè)輕量級(jí)純寫的文本工具提示庫(kù)。它支持種不同國(guó)家的貨幣格式,以及超過(guò)種不同語(yǔ)言的本地化設(shè)置。項(xiàng)目地址是一個(gè)根據(jù)規(guī)范構(gòu)建的輕量級(jí)框架。它壓縮后僅有,同時(shí)它沒(méi)有預(yù)先設(shè)定的元素和內(nèi)置動(dòng)畫。 在十一月份的前端技術(shù)列表中,我們整合了一些令人感到驚嘆的 GitHub 項(xiàng)目,其中包含了新的 CSS 框架、node.js包管理器,以及用于實(shí)現(xiàn)圖...

    chemzqm 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wujl596

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<