超长响应的 HTTP 请求

992 阅读15分钟

一、引发思考

最近在项目开发中,遇到了一个颇为棘手的问题。前端发起 HTTP 请求后,后端由于业务逻辑复杂,涉及大量数据的比对与处理,接近 10 几分钟才能完整处理好并响应回来。然而,浏览器在 2 分多种的时候,就因为请求一直没有响应而判定失败 。这一情况看似简单,却引发了我们对浏览器允许的 HTTP 请求最长响应时间这一问题的深入思考。

具体业务场景是这样的:用户点击按钮进行批量导入,弹框选择 excel 表后,前端直接将数据发给后端处理。后端拿到 excel 表,需将里面的数据先一一和数据库匹配,再和天眼查的数据比对,比对完成后将核实后的数据保存下来返回给前端。这里存在一个关键问题,前端不会限制 excel 表格的大小,理论上 excel 可以无限大。经测试,当 excel 里面存在超过 5000 条数据时,前端发起请求后,后端一直在处理,但浏览器在 2 分钟左右就因请求无响应而失败,可实际上后端代码仍在运行,整个过程预计要接近 20 分钟 。

这不禁让人疑惑,浏览器对于 http 请求的响应时间是否存在最大值呢?是否超出一定时间内无响应就会挂起这个请求?如果业务确实需要设置可以允许超长的请求,又是否有可能做到呢?带着这些问题,我们深入探究 HTTP 请求响应时间的奥秘。

二、标准探究:不同场景下的响应时间界定

HTTP 请求的响应时间被认为是长或短通常取决于具体应用场景和性能需求 。一般来说,可大致划分为以下几类:

  • 即时响应:通常在毫秒级别的响应时间被认为是即时响应。这适用于对实时性要求极高的应用场景,如实时聊天、金融交易等。在实时聊天中,用户发送一条消息后,期望能在极短时间内看到对方的输入提示或回复消息,若响应时间过长,聊天的流畅性和实时性将大打折扣,严重影响用户体验。金融交易场景更是如此,股票交易的买卖指令需要即时响应,每毫秒的延迟都可能导致交易成本的巨大差异,影响投资者的收益。
  • 快速响应:通常在几百毫秒(100 - 500ms)的响应时间被认为是快速响应。这适用于绝大多数 Web 应用,在这个时间范围内,用户可以在短时间内获得即时反馈,感觉操作流畅,不会因等待而产生厌烦情绪。以常见的电商网站为例,当用户点击商品详情页时,页面需要在几百毫秒内快速加载出商品的图片、描述、价格等信息,让用户能够迅速了解商品详情,从而继续下一步的操作,如加入购物车或下单购买。
  • 中等响应:通常在数百毫秒到 1 秒之间的响应时间被认为是中等响应。虽然不太理想,但对于普通 Web 应用来说仍然可以接受。例如一些企业内部的管理系统,用户在查询数据或提交表单时,1 秒以内的响应时间虽然不会让用户感到特别流畅,但也在可忍受范围内,不会对用户的操作流程造成较大阻碍。
  • 较长响应:通常在 1 秒到数秒之间的响应时间被认为是较长响应。这可能会对用户体验产生一定程度的影响,特别是在需要连续操作的场景中。比如在在线游戏中,当玩家进行角色技能释放、场景切换等操作时,如果响应时间在 1 - 5 秒,玩家可能会感觉到明显的延迟,影响游戏的连贯性和趣味性,降低玩家的游戏体验。
  • 长时间响应:通常超过数秒钟的响应时间被认为是长时间响应。这样的响应时间可能会显著影响用户体验,并且可能会导致用户不满意或放弃请求。像一些复杂的文件下载或大型数据分析任务,若响应时间超过 10 秒甚至更长,用户很可能会因为等待时间过长而取消操作,转而寻找其他更高效的解决方案。

需要注意的是,具体的响应时间标准可能因应用的特性、性能需求和用户期望而有所不同 。因此,在实际应用中,需要根据具体情况来确定何时将 HTTP 请求的响应时间视为长或短,并结合性能优化措施来提升系统的响应速度。

三、影响因素:多维度剖析响应时间

浏览器 HTTP 请求的响应时间并非固定不变,而是受到多种因素的综合影响 。这些因素涵盖了网络、服务器、客户端以及请求本身等多个层面,以下将详细分析各主要因素对响应时间的影响:

  • 网络环境:网络环境的稳定性和带宽是影响 HTTP 请求响应时间的关键因素 。在网络波动或延迟较高的情况下,数据传输的速度会大幅降低,从而导致请求响应时间延长。若用户处于网络信号较差的区域,如地下室、电梯等,或者网络服务提供商的网络出现拥堵,数据在传输过程中就需要花费更多时间进行等待和重传,这无疑会增加响应时间。带宽不足也会成为数据传输的瓶颈。当多个设备同时使用同一网络,且总带宽有限时,每个设备可获得的带宽就会相应减少。若在这种情况下进行 HTTP 请求,大量数据的传输速度会受到限制,使得响应时间变长。例如,在家庭网络中,当多人同时观看高清视频、进行在线游戏等大带宽需求的活动时,此时进行网页的 HTTP 请求,响应速度往往会明显变慢。
  • 服务器性能:服务器的硬件配置(如 CPU、内存、硬盘等)以及服务器软件的处理能力对响应时间起着决定性作用 。若服务器的 CPU 性能较低,在处理大量请求时就会出现运算速度跟不上的情况,导致请求处理时间延长。当服务器同时接收到大量用户的 HTTP 请求时,CPU 需要对每个请求进行解析、处理业务逻辑等操作,如果 CPU 性能不足,就会出现排队等待处理的情况,从而增加了每个请求的响应时间。内存不足也会影响服务器的性能。当服务器需要处理大量数据时,如果内存无法容纳所有数据,就需要频繁地从硬盘中读取和写入数据,而硬盘的读写速度相对较慢,这会大大降低服务器的处理效率,延长响应时间。服务器软件的优化程度也至关重要。高效的服务器软件能够合理地管理资源、优化请求处理流程,从而提高响应速度。例如,一些经过优化的 Web 服务器软件可以采用缓存技术,将经常访问的数据存储在内存中,当再次收到相同请求时,可以直接从缓存中读取数据并返回给客户端,大大减少了处理时间。
  • 请求数据量:请求数据量的大小直接影响响应时间 。当请求中包含大量数据时,无论是在数据的传输过程中,还是服务器对数据的处理过程中,都需要消耗更多的时间。在进行文件上传或下载的 HTTP 请求时,如果文件体积较大,数据需要通过网络逐块传输,传输过程中可能会受到网络带宽、网络延迟等因素的影响,导致传输时间变长。服务器在接收到大量数据后,对数据的解析、处理和存储也需要更多的计算资源和时间。例如,在进行大型数据库查询时,若查询结果数据量巨大,服务器需要花费较长时间对这些数据进行整理和返回给客户端,从而延长了响应时间。
  • 浏览器并发连接数限制:浏览器对同一主机域名的并发连接数通常存在限制 。当并发连接数达到上限时,后续的请求就需要等待已建立连接中的某个请求完成后,才能获得可用连接进行处理。主流浏览器的并发连接数限制一般在 6 - 8 个左右。这意味着,如果一个网页需要加载大量资源,如多个 JavaScript 文件、CSS 文件、图片等,而浏览器同时只能建立有限数量的连接,那么这些资源的请求就需要排队进行。在一个包含大量图片的网页加载过程中,由于浏览器的并发连接数限制,只能同时请求有限数量的图片,其他图片的请求就需要等待,这会导致整个网页的加载时间延长,从而增加了 HTTP 请求的响应时间。
  • 脚本阻塞:JavaScript 脚本的执行可能会阻塞页面的其他资源加载,进而影响 HTTP 请求的响应时间 。由于 JavaScript 是单线程执行的,当浏览器遇到一个需要长时间执行的 JavaScript 脚本时,它会暂停对页面其他部分的解析和渲染,包括对其他 HTTP 请求的处理。在页面中嵌入了一个复杂的 JavaScript 函数,该函数需要进行大量的计算或数据处理,当浏览器执行到该脚本时,页面的其他资源,如图片、样式表等的加载就会被阻塞,直到该 JavaScript 脚本执行完毕。这不仅会导致页面显示缓慢,还会使得与这些资源相关的 HTTP 请求响应时间变长。为了避免脚本阻塞,可以将 JavaScript 脚本放在页面底部,这样在页面的主要内容和其他资源加载完成后,再执行脚本,减少对页面加载的影响。也可以采用异步加载脚本的方式,如使用async或defer属性,让脚本在后台加载和执行,不会阻塞页面的渲染和其他请求的处理。
  • DNS 解析:在发起 HTTP 请求之前,浏览器需要通过 DNS 解析将域名转换为对应的 IP 地址 。如果 DNS 解析过程耗时较长,就会增加整个请求的响应时间。DNS 解析过程可能会受到多种因素的影响,如本地 DNS 服务器的性能、DNS 缓存的命中率等。若本地 DNS 服务器出现故障或负载过高,解析速度就会变慢。当用户访问一个新的网站时,如果本地 DNS 服务器没有该网站域名的缓存记录,就需要向其他 DNS 服务器查询,这个过程可能会涉及多次请求和响应,从而增加了解析时间。DNS 缓存的命中率也会影响解析速度。如果浏览器或本地 DNS 服务器中已经缓存了该域名的 IP 地址,那么在进行 DNS 解析时就可以直接使用缓存中的地址,大大缩短解析时间。为了优化 DNS 解析,可以利用 DNS 缓存,设置合理的 TTL(Time To Live)时间,让浏览器或本地 DNS 服务器在一定时间内缓存域名解析结果。也可以选择使用公共 DNS 服务器,如 Google DNS、Cloudflare DNS 等,这些服务器通常具有较高的性能和稳定性,能够提供更快的 DNS 解析服务。
  • SSL 连接:对于使用 HTTPS 协议的请求,在建立连接时需要进行 SSL 握手,这一过程会增加额外的时间开销 。SSL 握手用于在客户端和服务器之间建立安全的加密连接,确保数据传输的安全性。SSL 握手过程包括客户端和服务器之间的多次消息交换,以协商加密算法、验证服务器身份等。这个过程相对复杂,需要消耗一定的时间。在网络环境较差的情况下,SSL 握手的时间可能会更长。为了减少 SSL 连接的时间开销,可以采用优化的 SSL 配置,如使用更快的加密算法、启用 TLS 会话复用等。一些服务器可以配置支持 TLS 1.3 协议,相比之前的版本,TLS 1.3 在握手过程中进行了优化,减少了消息交换的次数,从而缩短了连接建立的时间。

四、浏览器差异:各浏览器的表现

不同浏览器在处理 HTTP 请求响应时间方面存在显著差异 ,这些差异主要源于浏览器的内核设计、资源管理策略以及对网络协议的实现方式等方面的不同 。

Chrome 浏览器是目前市场占有率较高的浏览器之一,其默认的超时时间通常为 4 分钟左右 。这一设置在大多数常规网络环境和应用场景下,能够满足用户对网页加载和数据获取的基本需求。在网络状况良好的情况下,Chrome 能够快速处理 HTTP 请求,高效地加载网页资源,为用户提供流畅的浏览体验。然而,当网络出现波动、延迟较高或者服务器响应缓慢时,Chrome 可能会在 4 分钟后判定请求超时,中断连接。若用户正在访问一个需要从远程服务器获取大量数据的网页,如在线视频平台的高清视频播放页面,若服务器因负载过高导致响应延迟,超过 4 分钟后,Chrome 可能会停止等待,导致视频无法正常播放。

Firefox 浏览器的默认超时时间一般为 60 秒,但在某些版本或特定配置下可能会有所不同 。Firefox 以其良好的开放性和可定制性受到部分用户的喜爱。在处理 HTTP 请求时,Firefox 的内核会根据自身的资源调度策略来管理连接和请求队列。在并发连接数较多的情况下,Firefox 可能会对请求进行排队处理,这可能会导致某些请求的响应时间延长。若一个网页中包含大量的图片、脚本和样式表等资源,Firefox 在同时请求这些资源时,可能会因为并发连接数的限制而使部分请求等待,从而增加整体的响应时间。

Safari 浏览器作为苹果设备的默认浏览器,其默认超时时间相对较长,大约为 12 分钟 。这一设置考虑到了苹果设备用户在使用移动网络或无线网络时,可能会遇到网络不稳定的情况,较长的超时时间可以减少因网络波动导致的请求失败。然而,Safari 在处理复杂网页和大量并发请求时,可能会出现性能瓶颈。在加载一个包含大量 JavaScript 动画和复杂交互效果的网页时,Safari 可能需要花费更多的时间来解析和执行脚本,从而影响 HTTP 请求的响应速度,导致页面加载缓慢。

Edge 浏览器是微软开发的新一代浏览器,其在 HTTP 请求响应时间的处理上也有自身的特点 。Edge 的默认超时时间和其他浏览器类似,但它在与微软的服务器和服务进行交互时,可能会有更好的优化。当用户使用 Edge 访问微软的在线服务,如 OneDrive、Outlook 等,Edge 可能会利用微软的网络优化技术,减少请求的响应时间,提高数据传输的效率。然而,在访问一些非微软的网站或应用时,Edge 的表现可能会受到网络环境和服务器性能的影响,与其他浏览器的差异并不明显。

五、总结展望:合理设置与未来趋势

综上所述,浏览器所允许的 HTTP 请求最长响应时间并没有一个固定的标准值,而是受到多种因素的综合影响 。在实际应用中,我们需要根据具体的业务场景和用户需求,综合考虑网络环境、服务器性能、请求数据量等因素,合理设置 HTTP 请求的超时时间,以确保系统能够稳定运行,同时提供良好的用户体验。