Airbnb 引入 HTTP Streaming,网页性能得到大幅度提升

Airbnb 通过引入HTTP Streaming来提升网站的页面加载性能。他们将测试的每个页面(包括主页)的首次内容绘制(First Contentful Paint,FCP)时间降低了大约 100 毫秒。他们还最小化了后端慢查询对加载时间的影响。

Airbnb 一直在尝试进行可能的改进,以便尽可能快地向网站用户呈现内容。他们发现,只在完全渲染后才发送页面主体并不能提供最佳的用户体验,特别是当页面主体内容依赖后端查询时。此外,网页通常还需要许多额外的资源,如 CSS 文件和外部 JavaScript 文件,浏览器需要下载这些文件,以便正确地向用户显示内容。这些依赖关系经常导致资源请求发生级联,这可以在网络序列视图中看出来,比如 Chrome 的Waterfall。

在这里插入图片描述

一种允许浏览器更早下载外部资源的常见做法是将所有引用它们的标记放在 HTML 页面头部的标签中。浏览器在读取标签时会下载外部资源。通常,这只会在整个 HTML 页面被传输后才会发生,如果页面内容依赖了缓慢的后端查询,则可能需要一些时间。

尽早冲刷(Early Flush)是一种利用 HTTP Streaming 技术让浏览器可以更早地加载外部资源的技术。它需要将 HTML 页面分成两个部分,并使用分块传输编码分别发送它们。在接收并解析了只包含 HTML 页面开头部分的初始块后,浏览器就可以开始下载外部资源。

尽管尽早冲刷并不是什么新技术,但也并没有被广泛使用,因为它需要渲染和发送不完整的 HTML 页面(有些标签没有关闭)。Airbnb 使用基于Express的NodeJS服务器来渲染React开发的网页,并将之前用于渲染整个 HTML 页面的单个 React 组件重新设计拆分为三个单独的组件。

尽早冲刷技术有助于优化 CSS 和 JavaScript 资源的 Waterfall 指标,但并不会降低渲染页面主体的延迟。使用现代 Web 应用程序框架可以在客户端或服务器端渲染内容(服务器端渲染)并分别获取数据,但这需要额外的网络请求。

Airbnb 的 Streaming 处理方法经过了改进,他们引入了第三个块(他们称之为延迟数据块),其中包含了页面所需的数据。他们使用MutationObserver来检测延迟的数据何时被加载,并将数据注入到应用程序网络数据存储中,从而避免了额外的网络请求。

![在这里插入图片描述](https://img-blog.csdnimg.cn/42e4db2ac3924bf9a2560cbd16ad030a.png)

Airbnb 必须解决一些问题才能在他们的技术栈中启用 HTTP Streaming。他们关闭了NGINX中的响应缓冲和haproxy负载均衡器中的Nagle算法,允许块响应数据可以不经修改地到达浏览器。

Airbnb 软件工程师Victor Lin总结了他们在这方面的经验,以及一个不断增长的支持 HTTP Streaming 的生态系统:虽然这个过程充满了挑战,但我们发现,调整现有的 React 应用程序来支持 Streaming 是非常可行和健壮的,尽管最初并不是为了它而设计的。我们也很高兴看到更广泛的前端生态系统朝着优先化 Streaming 的方向发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28721.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​大华智慧园区综合管理平台存在任意文件上传漏洞

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 大华智慧园区综合管理平台简介 大华智慧园区综合管理…

JavaScript数组所有方法集合

##方法 1、concat 用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组 2、copyWithin 浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度 3、entries 返回一个新的 Array Iterator 对象&#xf…

使用Vue + FormData + axios实现图片上传功能实战

前言 上节回顾 上一小节中,我们添加了Vue-router的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了ElementUI的el-menu做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个tg-menu的…

数据结构--线性表以及其顺序存储结构

这里写目录标题 线性表的定义和特征定义特征 案例引入稀疏多项式链表实现多项式相加小结 线性表的类型定义(抽象数据类型)定义格式基本操作小结 线性表的顺序表示和实现实现1顺序存储表示顺序表中元素存储位置的计算 实现2顺序表的优点问题出现结构体表示…

消息推送(websocket)集群化解决方案

目录 需求分析解决方案实现步骤架构图配置websocket请求地址配置websocket连接前置和连接关闭监听配置websocket处理程序配置redis交换机配置redis订阅监听配置redis发布监听需求分析 及时信息传递:消息推送功能能够确保网站向用户发送及时的重要信息,包括新闻更新、促销活动…

SpringCloud(六)Config配置中心

一、配置中心 官方文档:**https://docs.spring.io/spring-cloud-config/docs/current/reference/html/ 经过前面的学习,我们对于一个分布式应用的技术选型和搭建已经了解得比较多了,但是如果我们的微服务项目需要部署很多个实例&#xff0c…

基于node.js中的serialport模块实现无线传感网上位机功能

半个月前的无线传感网课设上位机的实现遇到了很多困难,特写此文章给有需要的朋友一些帮助,欢迎私信探讨 文章目录 前言一、node.js中的serialport模块二、express框架三、echarts实现拓扑图四、实现下行数据五、成果展示总结 前言 本文所要实现的功能以…

Spring Boot : ORM 框架 JPA 与连接池 Hikari

数据库方面我们选用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式连接数据库,毕竟使用 JDBC 并不是很方便,需要我们自己写更多的代码才能使用,一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties ,本…

MySQL事务与事务的隔离级别

MySQL事务与事务的隔离级别 什么事务?事务的特点(ACID)事务的隔离级别多事务运行的并发问题隔离级别repeatable read(可重复读)之 MVCC(多版本并发控制) 并发机制优化 什么事务? 事务…

为什么要分表和分区?

目录 🥶为什么要分表和分区? 🥶分表 🥶Mysql分表分为垂直切分和水平切分 🥶分表的几种方式: 🥶mysql集群 🥶利用merge存储引擎来实现分表 🥶分区 🥶什么是分…

OpenCv之图像轮廓

目录 一、图像轮廓定义 二、绘制轮廓 三、计算轮廓面积与周长 一、图像轮廓定义 图像轮廓是具有相同颜色或灰度的连续带你的曲线.轮廓在形状分析和物体的检测和识别中很有用 轮廓的作用: 用于图形分析物体的识别与检测 注意点: 为了检测的准确性,需要先对图像…

【Apifox】国产测试工具雄起

在开发过程中,我们总是避免不了进行接口的测试, 而相比手动敲测试代码,使用测试工具进行测试更为便捷,高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman,他还拥有一个非常nb的功能, 在接…