问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么 node.js 的 http.get 之类的 API 默认不支持设置超时

发布网友 发布时间:2022-05-15 09:18

我来回答

2个回答

懂视网 时间:2022-05-15 13:39

了解和测量HTTP时间有助于我们发现客户端到服务器或服务器到服务器之间的通信性能瓶颈。 本文介绍了HTTP请求中的时间开销,并展示了如何在Node.js中进行测量。

在我们开始了解HTTP时间开销之前,让我们来看一些基本的概念:

  • IP(互联网协议):IP是网络层协议,涉及网络寻址和路由。 IP负责根据一个或多个IP网络上的数据包头将数据包从源主机传送到目标主机。 它还定义了封装要传递的数据的数据包结构。

  • DNS(域名服务器):DNS是一种分层分散式命名系统,用于将诸如risingstack.com的人类可读主机名解析为机器可读的IP地址。

  • TCP(传输控制协议):TCP标准定义了如何在应用程序之间建立和维护网络对话以交换数据。 TCP在通过IP网络通信的主机上运行的应用程序之间提供可靠,有序和错误检查的八位字节流。 HTTP客户端通过建立TCP连接来发起请求。

  • SSL / TLS(传输层安全性):TLS是一种通过计算机网络提供通信安全性的加密协议。 SSL(安全套接字层)是TLS的不推荐使用的前身。 TLS和SSL都使用证书建立安全连接。 SSL证书不依赖于加密协议(如TLS),证书包含密钥对:公钥和私钥。 这些密钥一起工作,建立一个加密的连接。

  • 现在我们来看一下通常HTTP请求的时间表:


  • DNS查找:执行DNS查找所花费的时间。 DNS查找将域名解析为IP地址。 每个新的域需要一个完整的往返行程来进行DNS查找。 当目的地已经是IP地址时,没有DNS查找。

  • TCP连接:在源主机和目标主机之间建立TCP连接所需的时间。 必须在多步握手过程中正确建立连接。 TCP连接由操作系统管理,如果基础TCP连接无法建立,则OS范围的TCP连接超时将会进入我们应用程序中的超时配置。

  • TLS握手:完成TLS握手的时间。 在握手过程中,端点交换认证和密钥以建立或恢复安全会话。 没有HTTPS请求的不需要TLS握手。

  • 第一个字节的时间(TTFB):等待初始响应的时间。 此时间除了等待服务器处理请求和传递响应所花费的时间之外,还可以捕获往返服务器的延迟。

  • 内容传输:接收响应数据所花费的时间。 响应数据的大小和可用的网络带宽决定其持续时间。

  • 如何通过HTTP时间开销帮助发现性能瓶颈?

    例如,如果您的DNS查询所花费的时间比预期的要长,那么问题可能是您的DNS提供商或DNS缓存设置。

    缓慢的内容传输可能是由效率低下的反应机构引起的,例如发回太多的数据(未使用的JSON属性等)或缓慢的连接。

    测量Node.js中的HTTP时间开销

    为了测量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协议:

    // There is no TLS handshake without https 
    const tlsHandshake = tlsHandshakeAt !== undefined ? 
     getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined

    我们等待服务器开始发送第一个字节:

    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生态系统提供了很好的工具来从应用程序中提取这些指标。

    热心网友 时间:2022-05-15 10:47

      process.hrtime() 就是用来计算函数执行时间的。
      至于第一个问题,你需要监听 socket 事件,然后处理 socket.setTimeout() 来设置超时,监听 tiemout 来执行超时回调。
      Http 请求是基于 socket 的,请查阅相关文档。
      
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... come and have something to drink这句话中的后置定语可以去掉吗? come and have my party 土豆为什么涩口 土豆很涩,很苦怎样解决 4万公里换轮胎了,米其林185/60/R15的,感受,问题求解…… 无法打开网页页面 显示无法打开网页 黄精时代黄精膏是无添加的吗 比较关心? 无法打开网页,怎么办? 无法打开网页,怎么回事? 喜欢大海的说说 我想发一条关于大海的说说 谁会 发一条给我 安全阀接在隔电墙下面不行吗? 欠平安信用卡三千多,一个月了会怎么样 原神雪山找日志机器人打过一次怎么打不了第二次了 原神机器人绑定cookie 美图2手机里保存的微信照片怎么着找 北京社保可以在外地看病可以报销吗 我欠平安信用卡二千块,一个月不还多少利息?谢谢 请问高铁送老人可以进站吗? 我表哥把邻居家得了猪瘟的死猪买给别人吃,被*现场人脏惧获,请问会判刑吗? vivo nex重量 借款合同到期后追诉期多久 邻居家的猪得了非洲猪瘟,我的还没事,我需要预防我该怎么办? 同一个场里面抓的小猪别人家已经发现了非洲猪瘟,我家的小猪还是很精神从没有打过针,我的有被感染吗? i316g和i58g哪个好 给孩子起名字那个最好 欠条追溯期多久 起名字哪个好 给孩子起名字!好心人看看那个好 冯诺依曼提出的计算机经典硬件结构原则是什么? 小孩起名字哪个更好 usb接口的键盘怎么接线 哪个he 起名字好 USB键盘接线中原来的线坏了,找一个与原来的颜色不一样,怎么接? usb四根线红白绿黑,如何接键盘上的红(vm)白(g)绿(vp)蓝(v) 什么我家电脑的键盘接线插进USB接口键盘灯都不亮 个人电子邮箱怎么注册?如何注册TOM的个人邮箱? 汽车抛光怎么选择用蜡? 美白面膜哪个牌子好?能不能祛黑眼圈?