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

news2024/12/23 11:03:40

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.coloradmin.cn/o/773352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机房监控教程:管理不求人,即学即用!

供电系统的可靠性直接影响到广电数据中心机房设备的正常运转,涉及信息存储、节目录制采编传输、影音数据等生产质量和播出质量。 为确保数据中心机房安全运行,实现对数据中心机房各系统设备的统一监控与有效管理,减轻机房维护人员工作负担&am…

MySql5.6版本开启慢SQL功能-本次采用永久生效方式

文章目录 一、目的二、注意点说明三、操作步骤3.1 临时生效操作步骤3.2 永久生效操作步骤3.3 按日期生成日志文件3.4 执行成功后验证功能是否开启 四、慢SQL日志记录内容介绍五、Shell脚本 一、目的 开启 MySQL 的慢查询日志(Slow Query Log)可以帮助你…

怎么做活码二维码?动态码在线生成技巧

现在制作二维码用户大多习惯使用活码二维码,其优势在于能够在二维码不变的情况下修改内容,能够生成二维码长期使用,还可以设置有效期、加密等其他功能可以使用。那么怎么生成活码二维码呢?可以使用二维码生成器(免费在…

EasyCVR告警类型设置后首页需要刷新才能更新的问题优化

EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,包括:NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力,可在复杂的网络环境中&#xff0c…

【Jeston Nano】环境配置-部署yolov5

【Jeston Nano】环境配置-部署yolov5 一.Jeston Nano系统初始化设置1.Chinese 语言包2.备份3.更换源 二.环境配置,安装包1.CUDA2.pip33.jtop4.配置可能需要的库5.安装所需要的依赖环境6.安装opencv的系统级依赖,一些编码库7.更新CMake8.u盘兼容 三、安装…

python web开发之WSGI/uwsgi/uWSGI详解

1. 三者的定义 WSGI是一种通信协议。uwsgi是一种传输协议。uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。 2.三者的使用场景 WSGI,全称 Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接…

Jmeter性能测试,通过插件监控服务器资源使用情况

Jmeter作为性能测试的首选工具,那么在性能测试过程中如何方便快捷的监测服务器资源使用情况? 可以通过jmeter 安装"PerfMon(Servers Performance Monitoting)"插件并配合服务端资源监控工具进行实现,详细操作流程如下:…

MySQL 中使用变量实现排名名次

title: MySQL 中使用变量实现排名名次 date: 2023-7-16 19:45:26 tags:- SQL 高级查询 一. 数据准备: CREATE TABLE sql_rank (id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,user_id INT ( 11 ) UNSIGNED NOT NULL,score TINYINT ( 3 ) UNSIGNED NOT NULL,add_time date NO…

Spring Batch之读数据库—HibernateCursorItemReader(三十九)

一、HibernateCursorItemReader 对应关系映射(Object Relational Mapping,ORM)是一种为解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。 H…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

和chatgpt学架构03-引入UI框架(elment-plus)

目录 1 项目目录及文件的具体作用1.1 App.vue1.2 main.js的作用1.3 main.js什么时候被调用1.4 npm run serve干了什么事情1.5 package.json的作用 2 安装UI框架2.1 安装命令2.2 全局引入 3 启动工程总结 我们已经安装好了我们的vue脚手架&#xff0c;用vscode打开工程目录 要自…

有序链表转换二叉搜索树

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,nul…

封装hiredis成dll包,为老项目提供redis网络支持

第一步&#xff1a;准备VS环境 1、需要下载window8.1的SDK否则无法下载 2、平台工具集需要使用Visual Studio 2015(v140) 第二步&#xff1a;下载hiredis 去microsoft/hiredis下载windows版本的hiredis&#xff0c;并解压到本地 打开hiredis-master\msvs\vs-solutions中的sl…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

GPT 如此强大,我们可以利用它实现什么?

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer结构的预训练语言生成模型&#xff0c;由OpenAI研发。它可以生成高质量的自然语言文本&#xff0c;取得了很好的效果&#xff0c;被广泛应用于各个领域。以下是一些利用GPT实现的应用。 一…

01-复杂度1 最大子列和问题

中国大学MOOC-陈越、何钦铭-数据结构-2023夏季 题目集 题目 思路 令f(n)表示以第n个数结尾的连续序列的最大和&#xff0c;则状态转移方程为&#xff1a; 解释&#xff1a;如果f(n-1)小于零&#xff0c;代表对f(n)的值贡献为负。故&#xff0c;以为结尾的最大子列和就是&…

【Hydro】一个简单的HBV水文模型产流Python实现

说明 HBV模型包括一系列自由参数&#xff0c;其值可以通过率定得到。同时也包括一些描述流域和气候特征的参数&#xff0c;它们的值在模型率定是假定不变。子流域的划分使得在一个子流域中可能有很多参数值。虽然在大多数应用中&#xff0c;各子流域之间参数值只有很小的变化&a…

【已解决】idea使用debug启动一直卡着不动

debug启动时一直卡着不动出现下图提示&#xff0c;但是正常启动又可以启动 翻译结果是&#xff1a;方法断点可能会大大降低调试速度。很明显&#xff0c;有断点的位置没加对或者误加断点了&#xff0c;以下是解决方法。 打开 .idea文件夹&#xff0c;找到workspace.xml文件 找…

基于Javaweb实现ATM机系统开发实战(九)存款功能实现

先看前端界面确定后端需要处理的参数&#xff0c;把一些参数进行修改&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com…

JavaScript运算符优先顺序

● 我们可以通过MDN去查看运算符的优先级 ● 可以看到运算符是从左到右还是从右到左进行运算的&#xff1b; let x, y; x y 25 - 10 - 5; console.log (x, y);上面的运算会现实10 10&#xff0c;为什么会得到这样的结果呢&#xff1f;因为你查看mdn那个表你会发现&#xf…