最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Node.js了解與測(cè)量HTTP所花費(fèi)的時(shí)間詳解

 更新時(shí)間:2017年09月22日 09:32:39   作者:frontoldman  
這篇文章主要給大家介紹了關(guān)于利用Node.js了解與測(cè)量HTTP所花費(fèi)的時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

在我們開(kāi)始了解HTTP時(shí)間開(kāi)銷(xiāo)之前,讓我們來(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的人類(lèi)可讀主機(jī)名解析為機(jī)器可讀的IP地址。
  • TCP(傳輸控制協(xié)議):TCP標(biāo)準(zhǔn)定義了如何在應(yīng)用程序之間建立和維護(hù)網(wǎng)絡(luò)對(duì)話(huà)以交換數(shù)據(jù)。 TCP在通過(guò)IP網(wǎng)絡(luò)通信的主機(jī)上運(yùn)行的應(yīng)用程序之間提供可靠,有序和錯(cuò)誤檢查的八位字節(jié)流。 HTTP客戶(hù)端通過(guò)建立TCP連接來(lái)發(fā)起請(qǐng)求。
  • SSL / TLS(傳輸層安全性):TLS是一種通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)提供通信安全性的加密協(xié)議。 SSL(安全套接字層)是TLS的不推薦使用的前身。 TLS和SSL都使用證書(shū)建立安全連接。 SSL證書(shū)不依賴(lài)于加密協(xié)議(如TLS),證書(shū)包含密鑰對(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ì)話(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í)間開(kāi)銷(xiāo)幫助發(fā)現(xiàn)性能瓶頸?

例如,如果您的DNS查詢(xún)所花費(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í)間開(kāi)銷(xiāo)

為了測(cè)量Node.js中的HTTP時(shí)間開(kāi)銷(xiāo),我們需要訂閱特定的請(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ù)器開(kāi)始發(fā)送第一個(gè)字節(jié):

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

總持續(xù)時(shí)間從開(kāi)始和結(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)。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

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

相關(guān)文章

  • NestJS中集成TypeORM進(jìn)行數(shù)據(jù)庫(kù)操作

    NestJS中集成TypeORM進(jìn)行數(shù)據(jù)庫(kù)操作

    本文深入探討了如何在NestJS中集成TypeORM進(jìn)行數(shù)據(jù)庫(kù)操作,包括TypeORM的配置和集成、實(shí)體設(shè)計(jì)和關(guān)系映射、Repository模式的應(yīng)用、事務(wù)處理方案、數(shù)據(jù)庫(kù)遷移管理、性能優(yōu)化策略
    2024-12-12
  • 手把手教你更優(yōu)雅的修改node_modules里的代碼

    手把手教你更優(yōu)雅的修改node_modules里的代碼

    這篇文章主要給大家介紹了關(guān)于如何更優(yōu)雅的修改node_modules里的代碼的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • node.js 模塊和其下載資源的鏡像設(shè)置的方法

    node.js 模塊和其下載資源的鏡像設(shè)置的方法

    這篇文章主要介紹了node.js 模塊和其下載資源的鏡像設(shè)置的方法,在設(shè)置淘寶鏡像共有三種方法,每種方法通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-09-09
  • 詳解electron如何攔截網(wǎng)絡(luò)請(qǐng)求并處理響應(yīng)

    詳解electron如何攔截網(wǎng)絡(luò)請(qǐng)求并處理響應(yīng)

    這篇文章主要為大家詳細(xì)介紹了electron如何攔截網(wǎng)絡(luò)請(qǐng)求并處理響應(yīng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 詳解Node全局變量global模塊

    詳解Node全局變量global模塊

    這篇文章主要介紹了詳解Node全局變量global模塊,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • nodejs構(gòu)建本地web測(cè)試服務(wù)器 如何解決訪(fǎng)問(wèn)靜態(tài)資源問(wèn)題

    nodejs構(gòu)建本地web測(cè)試服務(wù)器 如何解決訪(fǎng)問(wèn)靜態(tài)資源問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了nodejs構(gòu)建本地web測(cè)試服務(wù)器,教大家如何解決訪(fǎng)問(wèn)靜態(tài)資源問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • mac下的nodejs環(huán)境安裝的步驟

    mac下的nodejs環(huán)境安裝的步驟

    本篇文章主要介紹了mac下的nodejs環(huán)境安裝的步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Nodejs實(shí)現(xiàn)文件上傳的示例代碼

    Nodejs實(shí)現(xiàn)文件上傳的示例代碼

    這篇文章主要介紹了Nodejs文件上傳的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Nodejs使用winston進(jìn)行日志記錄詳解

    Nodejs使用winston進(jìn)行日志記錄詳解

    在生產(chǎn)環(huán)境中,更常見(jiàn)的做法是使用專(zhuān)門(mén)的日志記錄庫(kù),如winston、log4js等,來(lái)實(shí)現(xiàn)更靈活和可配置的日志記錄功能,本篇文章將介紹的是winston的強(qiáng)大的日志記錄功能,快跟隨小編一起學(xué)習(xí)一下吧
    2024-01-01
  • Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的方法完整講解

    Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的方法完整講解

    MySQL2是一個(gè)基于Node.js的MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,它是MySQL官方推薦的驅(qū)動(dòng)之一,下面這篇文章主要給大家介紹了關(guān)于Nodejs使用mysql2操作數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

图木舒克市| 衡阳市| 桑日县| 旌德县| 阳城县| 健康| 武安市| 简阳市| 夹江县| 宜章县| 加查县| 望城县| 公主岭市| 泗洪县| 双牌县| 徐水县| 芒康县| 浦县| 宾阳县| 太白县| 平潭县| 买车| 洛宁县| 临颍县| 齐齐哈尔市| 河北省| 大理市| 镇江市| 永善县| 三都| 浦江县| 田东县| 灌南县| 泸州市| 五台县| 清流县| 汝城县| 会理县| 伊春市| 新乡市| 东莞市|